如本文所述,Android Room-通过自动生成获取新插入行的id,可以从新插入的对象中获取id。
但是,如何在MVVM模式中从DAO一直到我的活动类都获得这个ID
上面的一些答案建议使用rxjava和类似的东西:return Single.fromCallable<Long> { recipesDao.insertManual(cookingRecipes) }
但是实现两个完整的Gradle依赖项仅仅有一个方法调用有意义吗?
在我目前的结构下,难道没有办法做到这一点吗?
活动-ViewModel-存储库(-AsyncTask(-Dao
唯一的问题是从插入语句中获取返回值,该语句是从AsyncTask
:调用的
private static class UpdateChallengeInfosAsyncTask extends AsyncTask<ChallengeInfos, Void, Void> {
private ChallengeInfosDao mAsyncTaskDao;
UpdateChallengeInfosAsyncTask(ChallengeInfosDao dao) {
mAsyncTaskDao = dao;
}
@Override
protected Void doInBackground(ChallengeInfos... challengeInfos) {
mAsyncTaskDao.insert(challengeInfos[0]);
return null;
}
}
也许像这里这样的onPostExecute()
+Interface
组合是可能的
由于AsyncTask是一个单独的类,如何将OnPostExecute((的结果获取到主活动?
只需将AsyncTask作为"活动"中的嵌套类即可。然后,您可以从onPostExecute()
中调用属于"活动"的方法来传递ID值。
免责声明:AsyncTasks很糟糕,您应该使用其他方法。
免责声明2:如果您关注MVVM,ViewModel应该处理ID,而不是活动。
好吧,所以我最终做了什么,而且似乎运行得很好的是:
基本上使用了这个答案的结构:
https://stackoverflow.com/a/12575319/1972372
并在我的ViewModel
中实现了AsynTask
回调接口,其中有一个MutableLiveData
对象,用于"活动"在开始时调用一次,并一直保持到更新一次:
public class ChallengeViewModel extends AndroidViewModel implements ChallengesRepository.UpdateChallengeInfosAsyncTask.AsyncResponse {
private MutableLiveData<Integer> insertedChlgInfoID;
....
....
public void insertChallengeInfos(ChallengeInfos challengeInfos) {
mRepository.insertChallengeInfos(challengeInfos, this);
}
public LiveData<Integer> getInsertedChlgInfoID() {
return insertedChlgInfoID;
}
@Override
public void processFinish(Long result) {
insertedChlgInfoID.setValue(Ints.checkedCast(result));
}
}
我理解AsyncTask
在某些情况下可能被称为坏的原因,但我认为在我的情况下,它确实工作得很好,并且没有任何内存泄漏或类似的潜在风险,因为它只是非常基本的写操作。重写整个逻辑似乎对我的情况没有任何好处。