LiveData onChanged 方法仅在第一次调用
LiveData onChanged method called only first time
我有一个简单的应用程序可以轮询服务以在回收站视图中显示国家/地区列表。在这里,每当国家/地区列表发生任何变化时,我都会使用 LiveData 更新 recyclerview。问题是,LiveData 的 onChanged 方法仅在第一次调用 setValue 时被调用。但是在那之后如果数据有任何进一步的变化,onChanged 不会被调用??
以下是我的代码以获取更多信息 -
国家列表片段
//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);
国家视图模型
public class CountryViewModel extends AndroidViewModel {
private MutableLiveData> mCountryList;
private MyRetrofitClient myRetrofitClient;
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;
}
MyRetrofitClient.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 方法。
然而,它在 MyRetrofitClient 的情况下有所不同。在 MyRetrofitClient.getCountryList() 中第一次调用 setValue 时,它会调用 onChanged 方法。但是后来就不行了。
对不起,我一开始误解了问题。
您没有收到更改,因为您从未在 mCountryList
上调用 setValue
。
方法 getCountryList()
正在返回新对象 MutableLiveData<List<CountryModel>> lstResult
它调用的所有内容,没有人观察到。
解法:
不使用 getCountryList
返回 MutableLiveData
对象,而是在 onResponse()
中设置 mCountryList
。
代码
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()
观察
Activity:
countryViewModel.getCountryListener().observe(this,myObserver);
我有一个简单的应用程序可以轮询服务以在回收站视图中显示国家/地区列表。在这里,每当国家/地区列表发生任何变化时,我都会使用 LiveData 更新 recyclerview。问题是,LiveData 的 onChanged 方法仅在第一次调用 setValue 时被调用。但是在那之后如果数据有任何进一步的变化,onChanged 不会被调用??
以下是我的代码以获取更多信息 -
国家列表片段
//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);
国家视图模型
public class CountryViewModel extends AndroidViewModel { private MutableLiveData> mCountryList; private MyRetrofitClient myRetrofitClient;
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;
}
MyRetrofitClient.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 方法。
然而,它在 MyRetrofitClient 的情况下有所不同。在 MyRetrofitClient.getCountryList() 中第一次调用 setValue 时,它会调用 onChanged 方法。但是后来就不行了。
对不起,我一开始误解了问题。
您没有收到更改,因为您从未在 mCountryList
上调用 setValue
。
方法 getCountryList()
正在返回新对象 MutableLiveData<List<CountryModel>> lstResult
它调用的所有内容,没有人观察到。
解法:
不使用 getCountryList
返回 MutableLiveData
对象,而是在 onResponse()
中设置 mCountryList
。
代码
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()
观察
Activity:
countryViewModel.getCountryListener().observe(this,myObserver);