我刚刚开始在我的应用程序中使用 Android 的架构组件,我有一个用例:
- 片段是
ViewModel
LiveData
的观察者(来自Room
请求( - 此片段在某个时间点启动活动
- 活动需要使用相同的数据(与片段中的
LiveData
相同(并对其进行更新 - 然后用户返回到片段
我尝试使用相同的ViewModel
类并将片段和活动添加为观察者,认为以某种方式从活动更新会在返回片段时影响片段,但它不起作用。 这两个ViewModel
似乎是独立的。
从活动返回时如何强制刷新片段数据(例如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
}
我设法通过为视图模型设置一个通用的生命周期所有者,并在不同的片段上使用相同的视图模型来获得您想要的结果。 在我的片段中,我得到这样的视图模型:
内部片段:
var userViewModel = activity?.run{ViewModelProviders.of(this, SharedUserViewModel.MainActivityViewModelFactory(applicationContext))[SharedUserViewModel::class.java]}
您是否看到我使用该活动作为"ViewModelProviders.of"参数? 这样,视图模型具有相同的所有者,它对我来说工作正常。
是的,您可以使用 SharedViewModel 在活动和片段之间共享视图模式。