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

Android 如何使用相同的数据异步更新所有片段?,android,android-fragments,kotlin,android-recyclerview,Android,Android Fragments,Kotlin,Android Recyclerview,这就是我要做的 我在MainActivity中托管了2个片段 片段1只有几个小部件需要更新。 片段2有一个recycler视图来显示项目列表 我首先获取数据类的一个实例并调用其fetchData方法 fetchData()方法与本地数据库通信,首先查看我的数据是否已存储在本地数据库中 如果它被存储,那么它只返回该数据,片段2中的recycler视图只显示该数据 但是,如果本地数据库中的数据不存在(这是一个异步调用),则当我必须从internet获取新数据时,问题就会出现。(我用来调用web AP

这就是我要做的

我在MainActivity中托管了2个片段

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

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

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

如果它被存储,那么它只返回该数据,片段2中的recycler视图只显示该数据

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


现在,我不知道如何告诉片段1和片段2在数据库更新后使用更新的数据?

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

  • 创建一个ViewModel,它将承载您的数据类实例。

  • 在两个片段中获取视图模型引用

    final MyModel viewModel = ViewModelProviders.of(getActivity()).get(MyModel.class);
    
  • 使ViewModel将数据类的结果作为LiveData公开。

    private MutableLiveData mCurrentData;
    公共可变LiveData getCurrentData(){
    if(mCurrentName==null){
    mCurrentData=new MutableLiveData();
    }
    返回mCurrentData;
    }
    公共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);
    
    //获取视图模型。
    mModel=ViewModelProviders.of(getActivity()).get(MyModel.class);
    //创建更新UI的观察者。
    最终观察者myObserver=新观察者(){
    @凌驾
    公共void onChanged(@Nullable final String newData){
    //对新数据做些什么
    }
    };
    //观察LiveData,作为LifecycleOwner和observer传入此活动。
    mModel.getCurrentData().observe(这是myObserver);
    
  • 使用这种方法,您的两个片段将在ViewModel的两个片段中的
    myObserver
    实例中获得相同的更新


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

    请简要说明您的问题。您的要求是,如果不从internet更新,则从本地调用,否则从internet调用。对吗..?好的,然后您希望在从数据库显示之后,首先将数据存储在数据库中,不是直接从互联网上。好的,那么你应该使用时间戳。当从互联网上更新数据时,你的时间和互联网数据时间不匹配,所以你应该更新。看起来你面临的问题比你感觉的要大。通常,您需要组织代码来处理所描述的逻辑。这与具体的方法或领域无关。这是关于应用程序的结构。我真的向你推荐这篇文章:它可能看起来有点势不可挡。在这种情况下,请查看该文章中的链接以获得更好的理解。
    // 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);