视图模型不断创建实时数据实例 [英] View Model keeps creating instance of Live Data
问题描述
我通过活动的onCreate
方法创建了View Model的实例.
I created the instance of View Model in onCreate
method of an activity.
ticketViewModel = ViewModelProviders.of(this).get(TicketViewModel.class);
然后我有一个方法AddTicket
,它使用viewModel
来启动服务,并且在viewModel
响应时,我会取消加载动画.
Then i have a method, AddTicket
, which uses viewModel
to hit a service and on response from viewModel
i dismiss loading animation.
public void addTicket(View view){
ticketViewModel.AddTicket(id).observe(this, response ->{
dismissLoadingAnimation();
}
现在添加票证后,用户可以按Add Ticket
按钮,然后再次调用addTicket()
方法.
Now after adding a ticket, user can repress the Add Ticket
button, and the addTicket()
method will be called again.
但是这次ViewModel中定义的observer
被调用了2次,导致2次网络调用和2次dismissLoadingAnimation
执行.
but this time observer
defined in ViewModel gets called 2 times, resulting in 2 network calls, and 2 dismissLoadingAnimation
execution.
如果我继续按下addTicket
按钮,则在ViewModel
内部定义的正在执行的观察程序的数量将增加.
And if i keep pressing addTicket
button, the number of executing observer defined inside ViewModel
keep increases.
这是我的视图模型代码.
public class TicketViewModel extends AndroidViewModel implements IServiceResponse {
MutableLiveData<String> mObservableResponse = new MutableLiveData<String>();
public MutableLiveData AddTicket(String id){
JsonObject jsonObject= new JsonObject();
jsonObject.addProperty("id", id);
NetworkUtility networkUtility= new NetworkUtility(this, ADD_TICKET);
networkUtility.hitService(URL, jsonObject, RequestMethods.POST);
return mObservableResponse;
}
@Override
public void onServiceResponse(String response, String callType){
if(serviceTag.equalsIgnoreCase(ADD_TICKET)){
mObservableResponse.setValue("success");
}
}
}
推荐答案
- Viewmodel的目的是公开可观察对象(Livedata)
- View(Activity/Fragment)的目的是获取这些可观察对象并对其进行观察
- 只要这些Observables(Livedata)发生更改,该更改就会自动发布到活动的已订阅所有者(Activity/Fragment),因此您不必在onPause/onStop中将其删除,因为这不是强制性的
我可以建议对您的代码进行一些更改,以解决上述指针的问题
I can suggest few changes to your code to solve the problem with the above mentioned pointers
ViewModel
public class TicketViewModel extends AndroidViewModel implements IServiceResponse {
MutableLiveData<String> mObservableResponse = new MutableLiveData<String>();
public LiveData<String> getResponseLiveData(){
return mObservableResponse;
}
public void AddTicket(String id){
JsonObject jsonObject= new JsonObject();
jsonObject.addProperty("id", id);
NetworkUtility networkUtility= new NetworkUtility(this, ADD_TICKET);
networkUtility.hitService(URL, jsonObject, RequestMethods.POST);
}
@Override
public void onServiceResponse(String response, String callType){
if(serviceTag.equalsIgnoreCase(ADD_TICKET)){
mObservableResponse.setValue("success");
}
}
}
查看
onCreate(){
ticketViewModel = ViewModelProviders.of(this).get(TicketViewModel.class);
observeForResponse();
}
private void observeForResponse(){
ticketViewModel.getResponseLiveData().observe(this, response ->{
//do what has to be updated in UI
}
}
public void addTicket(View view){
ticketViewModel.AddTicket(id);
}
希望这对您有所帮助:)
Hope this is of help :)
这篇关于视图模型不断创建实时数据实例的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!