gpt4 book ai didi

java - 将数据从 ViewModel 的 AsyncTask 传递到调用 Activity

转载 作者:行者123 更新时间:2023-11-30 00:10:30 25 4
gpt4 key购买 nike

我正在使用 Room 向我的数据库添加一个项目。

我在 AddFriendActivity 中从用户处获取项目的详细信息,它调用 AddFriendViewModeladdItem(),后者又调用 子类 AddAsyncTask .

项目被插入,我在 AsyncTask 的 doInBackground()OnPostExecute() 中获得 id。现在我需要在我的 AddFriendActivity 中传递或获取此 ID。

我的 Activity :

public class AddFriendActivity extends AppCompatActivity {

private AddFriendViewModel addFriendViewModel;

@Override
protected void onCreate(Bundle savedInstanceState) {
.
.
.
addFriendViewModel = ViewModelProviders.of(this).get(AddFriendViewModel.class);

FloatingActionButton fab = findViewById(R.id.fab);
fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
addFriend();
}
});

}

private void addFriend() {
.
.
.
addFriendViewModel.addFriend(new FriendEntity(...));
finish();
}
}

我的带有子类 AddAsyncTask 的 ViewModel 类:

public class AddFriendViewModel extends AndroidViewModel {

private AppDatabase appDatabase;

public AddFriendViewModel(Application application) {
super(application);
appDatabase = AppDatabase.getDatabase(this.getApplication());
}

void addFriend(final FriendEntity friendEntity) {
AddAsyncTask myTask = new AddAsyncTask(appDatabase);
myTask.execute(friendEntity);
}

private static class AddAsyncTask extends AsyncTask<FriendEntity, Void, Long> {

private AppDatabase db;

AddAsyncTask(AppDatabase appDatabase) {
db = appDatabase;
}

@Override
protected Long doInBackground(final FriendEntity... params) {
return db.friendDao().insert(params[0]);
}

@Override
protected void onPostExecute(Long insertedId) {

}
}
}

最佳答案

添加接口(interface)

  public interface IdCallback{
void onFriendInserted(Long id);
}

在AddFriendActivity中实现

class AddFriendActivity extends AppCompatActivity implements IdCallback{
private AddFriendViewModel addFriendViewModel;

@Override
protected void onCreate(Bundle savedInstanceState) {
.
.
.
addFriendViewModel = ViewModelProviders.of(this).get(AddFriendViewModel.class);

FloatingActionButton fab = findViewById(R.id.fab);
fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
addFriend();
}
});

}

private void addFriend() {
.
.
.
addFriendViewModel.addFriend(new FriendEntity(...),this);//<-- pass this
finish();
}

public void onFriendInserted(Long id){
// do something with id
}
...

}

通过构造函数将 interface 传递给我们的 ViewModel 并在返回 Id 时调用它

 public class AddFriendViewModel extends AndroidViewModel {

private AppDatabase appDatabase;
private IdCallback callback;

public AddFriendViewModel(Application application) {
super(application);
appDatabase = AppDatabase.getDatabase(this.getApplication());
}

void addFriend(final FriendEntity friendEntity,IdCallback callback) {
AddAsyncTask myTask = new AddAsyncTask(appDatabase);
this.callback = callback; //< assign
myTask.execute(friendEntity);
}

private static class AddAsyncTask extends AsyncTask<FriendEntity, Void, Long> {

private AppDatabase db;

AddAsyncTask(AppDatabase appDatabase) {
db = appDatabase;
}

@Override
protected Long doInBackground(final FriendEntity... params) {
return db.friendDao().insert(params[0]);
}

@Override
protected void onPostExecute(Long insertedId) {
callback.onFriendInserted(insertedId);
}
}
}

关于java - 将数据从 ViewModel 的 AsyncTask 传递到调用 Activity,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48219749/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com