android - 如何使用相同的数据异步更新所有 fragment ?

标签 android android-fragments kotlin android-recyclerview

enter image description here

这就是我正在尝试做的事情。

我在 MainActivity 中托管了 2 个 fragment 。

fragment 1 只有几个小部件需要更新。 fragment 2 有一个回收器 View 来显示项目列表。

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

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

如果它被存储,那么它只是返回该数据,并且 fragment 2 中的回收器 View 只是显示该数据。

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

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

最佳答案

架构组件提供了一种连接 Activity 及其内部 fragment 的便捷方法。

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

  2. 在两个 fragment 中获取 View 模型引用。

    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. 订阅您的 fragment 中提供的实时数据。

    // 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);
    

使用这种方法,您的两个 fragment 都将在 ViewModel 中的两个 fragment 的 myObserver 实例中获得相同的更新。

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

关于android - 如何使用相同的数据异步更新所有 fragment ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49377476/

相关文章:

android - OnTouch 监听器无法在 fragment 中工作

java - 在 fragment 之间共享代码

android - 当我弹出 BackStack 时,自定义 fragment 过渡动画无法正确播放

android - java.net.ConnectException : failed to connect to/192. 168.1.107(端口 80)10000 毫秒后:isConnected 失败:EHOSTUNREACH(没有到主机的路由)

android - 如何访问钛合金外部 View 中的元素?

android - Flutter,如何在同一设备上发布和调试应用程序?

android - Jsoup 和安卓

android - 正则表达式删除除句点外的所有特殊字符

java - 带有负载的 Jsoup HTTP POST

android - 如何通过 Android 检测测试在我的计算机上创建文件?