【发布时间】:2019-09-13 11:56:47
【问题描述】:
我刚开始在我的应用中使用 Android 的架构组件,我有一个用例:
- 片段是
ViewModel的LiveData的观察者(来自Room请求) - 此片段在某个时间点开始一个活动
- 活动需要使用相同的数据(如片段中的
LiveData)并更新它 - 然后用户返回到片段
我尝试使用相同的ViewModel 类并将片段和活动添加为观察者,认为从活动更新会在返回片段时影响片段,但它不起作用。
这两个ViewModels 似乎是独立的。
从 Activity 返回时如何强制刷新片段数据(例如在 onActivityResult 中)?
或者是否可以在片段和活动之间共享相同的ViewModel? (虽然我对此表示怀疑,因为ViewModel 与观察者的生命周期相关联)
片段
public void onAttach(@NonNull Context context) {
...
mViewModel = ViewModelProviders.of(this).get(MyViewModel.class);
mViewModel.getData().observe(this, new Observer<List<Data>>() {
@Override
public void onChanged(List<Data> data) {
mAdapter.setData(data);
}
});
}
// in an onClick method
startActivity(intent); // go to the Activity
活动
protected void onCreate(Bundle savedInstanceState) {
...
mViewModel = ViewModelProviders.of(this).get(MyViewModel.class);
mViewModel.getData().observe(this, new Observer<List<Data>>() {
@Override
public void onChanged(List<Data> data) {
mPagerAdapter.setData(data);
}
});
}
任何帮助将不胜感激!
编辑:
查看模型
public class MyViewModel extends AndroidViewModel {
private Dao dao;
private ExecutorService executorService;
public MyViewModel (@NonNull Application application) {
super(application);
dao = AppDatabase.getInstance(application).getDao();
executorService = Executors.newSingleThreadExecutor();
}
public LiveData<Data> getData() {
return dao.getAllData();
}
// other methods to update and delete with executorService
}
【问题讨论】:
-
生命周期对于每个活动或新生来说都是独立的,因此您的两个 ViewModel 将是完全不同的生命周期,我建议您在启动片段时将数据发送到 Intent 并在您完成后将其推回完成(如果您没有从片段内部保存它,否则您可以再次调用房间数据库)
-
如果 Activity 和 Fragment 都使用相同的 ViewModel 实例,您所描述的应该可以工作。为此,我使用 Koin 进行依赖注入。
-
请也发布 ViewModel 类
-
你可以查看这个答案:stackoverflow.com/questions/44641121/…
-
发布你的viewModel类
标签: android viewmodel android-room android-architecture-components android-livedata