如何使用相同的数据异步更新所有片段?

时间:2018-03-20 06:19:26

标签: android android-fragments kotlin recycler-adapter

enter image description here

这就是我想要做的事情。

我在MainActivity中托管了2个片段。

Fragment 1只有几个小部件需要更新。 片段2有一个回收者视图来显示项目列表。

我首先获取数据类的实例并调用其fetchData方法。

fetchData()方法与本地数据库通信,首先查看我的数据是否已存储在本地数据库中。

如果存储,则只返回该数据,片段2中的Recycler视图只显示该数据。

但是如果我的本地数据库中的数据不存在是异步调用,那么当我必须从互联网上获取新数据时,就会出现问题。 (我用来调用web API的库是Volly)

现在我很困惑如何在数据库更新后告诉Fragment 1和Fragment 2使用更新的数据?

1 个答案:

答案 0 :(得分:2)

架构组件提供了一种在其中连接活动和片段的便捷方式。

  1. 创建一个ViewModel,它将托管您的数据类实例。 https://developer.android.com/topic/libraries/architecture/viewmodel.html#implement

  2. 在两个片段中获取视图模型参考。

    final MyModel viewModel = ViewModelProviders.of(getActivity()).get(MyModel.class);
    
  3. 使您的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());
    }
    
  4. 在您的片段中订阅提供的实时数据。

    // 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);
    
  5. 使用此方法,您的片段将在ViewModel的两个片段中的myObserver个实例中获得相同的更新。

    Here您可以找到更详细的指南。