代码之家  ›  专栏  ›  技术社区  ›  user1122549

仅第一次调用LiveData onChanged方法

  •  5
  • user1122549  · 技术社区  · 6 年前

    我有一个简单的应用程序,可以轮询一个服务,在recyclerview中显示国家列表。在这里,每当国家/地区列表发生任何变化时,我都会使用LiveData更新recyclerview。问题是,LiveData的onChanged方法只有在第一次调用setValue时才被调用。但在此之后,如果数据有任何进一步的更改,则不会调用onChanged??

    以下是我的代码以获取更多信息-

    CountryListFragment

            //Setup observer
        Observer<List<CountryModel>> myObserver = new Observer<List<CountryModel>>() {
            @Override
            public void onChanged(@Nullable List<CountryModel> countryModels) {
                mCountryList = countryModels;
                //Update recyclerview
                myAdapter.updateRecyclerView(mCountryList);
            }
        };
        //Set Observer for Viewmodel
        countryViewModel.getmCountryList().observe(this,myObserver);
    

    CountryViewModel

    公共类CountryViewModel扩展了AndroidViewModel{ 私有MutableLiveData>McCountryList; 私人MyRefughtClient MyRefughtClient;

    public CountryViewModel(@NonNull Application application) {
        super(application);
    }
    
    public void init(){
        mCountryList = new MutableLiveData<>();
        myRetrofitClient = new MyRetrofitClient();
        **mCountryList = myRetrofitClient.getCountryList();   //This works**
        pollCountryList();
    }
    
    //Create polling request for every 10 secs
    private void pollCountryList(){
        final Handler mHandler = new Handler();
    
            new Thread(new Runnable() {
                @Override
                public void run() {
                    for (int i=0; i<30;i++){
                        try {
                            Thread.sleep(10000);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                        //Call API on main thread
                        mHandler.post(new Runnable() {
                            @Override
                            public void run() {
                                **myRetrofitClient.getCountryList();  //NOT CALLING ONCHANGED??**
                            }
                        });
                    }
    
                }
            }).start();
    }
    
    public MutableLiveData<List<CountryModel>> getmCountryList() {
        return mCountryList;
    }
    

    MyReformationClient。getCountryList()

    public MutableLiveData<List<CountryModel>> getCountryList(){
        final MutableLiveData<List<CountryModel>> lstResult = new MutableLiveData<>();
        MockServiceInterface serviceInterface = mRetrofit.create(MockServiceInterface.class);
        Call<List<CountryModel>> countryList = serviceInterface.getCountryList();
        countryList.enqueue(new Callback<List<CountryModel>>() {
            @Override
            public void onResponse(Call<List<CountryModel>> call, Response<List<CountryModel>> response) {
                if (response.isSuccessful()){
                    List<CountryModel> lstResponse = response.body();
                    lstResult.setValue(lstResponse);
                }else {
                    System.out.print(response.errorBody());
                }
            }
    
            @Override
            public void onFailure(Call<List<CountryModel>> call, Throwable t) {
                t.printStackTrace();
            }
        });
        return lstResult;
    }
    

    谢谢

    编辑:

    一些补充意见- 在CountryViewModel中调用MutableLiveData实例(mCountryList)的setValue方法时,每次都会调用onChanged方法。

    然而,对于MyRefughtClient,情况有所不同。第一次在MyRefundationClient中调用setValue。getCountryList(),它调用onChanged方法。但后来情况并非如此。

    1 回复  |  直到 6 年前
        1
  •  0
  •   Yogesh Lakhotia    6 年前

    对不起,我一开始误解了这个问题。

    您没有收到更改,因为您从未打过电话 setValue 在…上 mCountryList

    方法 getCountryList() 正在返回新对象 MutableLiveData<List<CountryModel>> lstResult 它所称的一切,没有人观察到。

    解决方案:

    而不是返回 MutableLiveData 对象具有 getCountryList 设置 McCountryList公司 在里面 onResponse()

    密码

    public void init(){
        mCountryList = new MutableLiveData<>();
        myRetrofitClient = new MyRetrofitClient();
        myRetrofitClient.getCountryList();
        pollCountryList();
    }
    
    public LiveData<List<CountryModel>> getCountryListener() {
        return mCountryList;
    }
    
    public void getCountryList(){
        MockServiceInterface serviceInterface = mRetrofit.create(MockServiceInterface.class);
        Call<List<CountryModel>> countryList = serviceInterface.getCountryList();
        countryList.enqueue(new Callback<List<CountryModel>>() {
            @Override
            public void onResponse(Call<List<CountryModel>> call, Response<List<CountryModel>> response) {
                if (response.isSuccessful()){
                    List<CountryModel> lstResponse = response.body();
                    mCountryList.setValue(lstResponse);
                }else {
                    System.out.print(response.errorBody());
                }
            }
            @Override
            public void onFailure(Call<List<CountryModel>> call, Throwable t) {
                t.printStackTrace();
            }
        });
    }
    

    使用 getCountryListener() 观察。

    活动:

    countryViewModel.getCountryListener().observe(this,myObserver);