将数据从 ViewModel 的 AsyncTask 传递到 Calling Activity

Passing data from AsyncTask of ViewModel to Calling Activity

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

我从 AddFriendActivity 中的用户那里获取了项目的详细信息,它调用了 AddFriendViewModeladdItem()依次调用 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);
        }
    }
}