视图模型不断创建实时数据实例 [英] View Model keeps creating instance of Live Data

查看:80
本文介绍了视图模型不断创建实时数据实例的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我通过活动的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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆