这就是我想要做的事情。
我在MainActivity中托管了2个片段。
Fragment 1只有几个小部件需要更新。 片段2有一个回收者视图来显示项目列表。
我首先获取数据类的实例并调用其fetchData方法。
fetchData()方法与本地数据库通信,首先查看我的数据是否已存储在本地数据库中。
如果存储,则只返回该数据,片段2中的Recycler视图只显示该数据。
但是如果我的本地数据库中的数据不存在是异步调用,那么当我必须从互联网上获取新数据时,就会出现问题。 (我用来调用web API的库是Volly)
现在我很困惑如何在数据库更新后告诉Fragment 1和Fragment 2使用更新的数据?
答案 0 :(得分:2)
架构组件提供了一种在其中连接活动和片段的便捷方式。
创建一个ViewModel,它将托管您的数据类实例。 https://developer.android.com/topic/libraries/architecture/viewmodel.html#implement
在两个片段中获取视图模型参考。
final MyModel viewModel = ViewModelProviders.of(getActivity()).get(MyModel.class);
使您的ViewModel将数据类的结果公开为LiveData。 https://developer.android.com/topic/libraries/architecture/livedata.html
private MutableLiveData<String> mCurrentData;
public MutableLiveData<String> getCurrentData() {
if (mCurrentName == null) {
mCurrentData = new MutableLiveData<String>();
}
return mCurrentData;
}
public void updateData() {
getCurrentData().setValue(myDataClass.getNewData());
}
在您的片段中订阅提供的实时数据。
// Get the ViewModel.
mModel = ViewModelProviders.of(getActivity()).get(MyModel.class);
// Create the observer which updates the UI.
final Observer<String> myObserver = new Observer<String>() {
@Override
public void onChanged(@Nullable final String newData) {
// do something with the new data
}
};
// Observe the LiveData, passing in this activity as the LifecycleOwner and the observer.
mModel.getCurrentData().observe(this, myObserver);
使用此方法,您的片段将在ViewModel的两个片段中的myObserver
个实例中获得相同的更新。
Here您可以找到更详细的指南。