【问题标题】:Passing data from AsyncTask of ViewModel to Calling Activity将数据从 ViewModel 的 AsyncTask 传递到 Calling Activity
【发布时间】:2018-01-12 04:51:36
【问题描述】:

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

我在 AddFriendActivity 中从用户那里获取项目的详细信息,它调用 AddFriendViewModeladdItem() 进而调用 subclass AddAsyncTask .

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

我的活动:

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) {

        }
    }
}

【问题讨论】:

标签: java android android-viewmodel


【解决方案1】:

添加接口

  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);
        }
    }
}

【讨论】:

  • 我认为这可能会导致内存泄漏,因为您持有对活动的引用。 “警告:ViewModel 绝不能引用视图、生命周期或任何可能持有对活动上下文的引用的类。” developer.android.com/topic/libraries/architecture/viewmodel
  • @MathiasJeppsson 我们可以通过弱引用来避免这种情况
猜你喜欢
  • 2020-12-12
  • 1970-01-01
  • 2022-01-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多