标签:android android-layout performance android-viewmodel
我在活动的onCreate方法中创建了View Model的实例.
ticketViewModel = ViewModelProviders.of(this).get(TicketViewModel.class);
然后我有一个方法AddTicket,它使用viewModel来命中服务,并且在viewModel的响应中我解除了加载动画.
public void addTicket(View view){
ticketViewModel.AddTicket(id).observe(this, response ->{
dismissLoadingAnimation();
}
现在添加票证后,用户可以按下“添加票证”按钮,再次调用addTicket()方法.
但这次在ViewModel中定义的观察者被调用2次,导致2次网络调用,2次dismissLoadingAnimation执行.
如果我一直按下addTicket按钮,ViewModel中定义的执行观察者的数量会不断增加.
这是我的View Model代码.
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中定义的执行观察者的数量随着每次点击而保持增加您正在注册新的观察者.你不应该用onClick()方法注册观察者.
您应该在Activity的onCreate()方法或片段的onViewCreated方法中执行此操作.如果你这样做,那么当你完成工作时就不需要删除Observer.生命周期机制将为您提供.
但如果你真的想为你回答问题,那么你就是这样做的
yourViewModel.yourList.removeObservers(this)
传递这意味着传递您的活动,或者有第二种方式:
yourViewModel.yourList.removeObserver(observer)
val observer = object : Observer<YourObject> {
override fun onChanged(t: YourObject?) {
//todo
}
}
标签:android,android-layout,performance,android-viewmodel 来源: https://codeday.me/bug/20190607/1193865.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。