将数据从 ViewModel 的 AsyncTask 传递到 Calling Activity
Passing data from AsyncTask of ViewModel to Calling Activity
我正在使用 Room 向我的数据库添加一个项目。
我从 AddFriendActivity 中的用户那里获取了项目的详细信息,它调用了 AddFriendViewModel 的 addItem()依次调用 subclass 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();
}
}
我的 ViewModel class 与子class AddAsyncTask:
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) {
}
}
}
添加接口
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);
}
}
}
我正在使用 Room 向我的数据库添加一个项目。
我从 AddFriendActivity 中的用户那里获取了项目的详细信息,它调用了 AddFriendViewModel 的 addItem()依次调用 subclass 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();
}
}
我的 ViewModel class 与子class AddAsyncTask:
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) {
}
}
}
添加接口
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);
}
}
}