2017-08-24 60 views
0

我的应用程序集成与MVVM +改造+匕首调用onChanged功能在Android的MVVM第二个呼叫

,当涉及到视图模型我已经使用MutableLiveData与片段注册观察者和视图模型

行为异常

因此,当视图加载它调用视图模型和调用Web服务然后onChnaged函数的观察员将弹出数据,但是当我添加一个按钮单击并调用相同的功能它表现不寻常这里是代码示例。

ViewModel 
private MediatorLiveData<Resource<PostCartResponse>> postCartResponse 
      = new MediatorLiveData<>(); 
    public LiveData<Resource<PostCartResponse>> postProductToCart(
       final PostCart postCart) { 
      postCartResponse.addSource(this.cartRepository.postCart(postCart), 
        new Observer<Resource<PostCartResponse>>() { 
         @Override 
         public void onChanged(@Nullable Resource<PostCartResponse> response) { 
          postCartResponse.setValue(response); 
         } 
        }); 
      return postCartResponse; 
     } 
Fragment 
productDetailsViewModel.postProductToCart(new PostCart(1, generatedSku)) 
       .observe(this, new Observer<Resource<PostCartResponse>>() { 
        @Override 
        public void onChanged(@Nullable Resource<PostCartResponse> response) { 

         if (response.status == Status.SUCCESS) { 
          Timber.d("SUCCESS"); 
         } else if (response.status == Status.INVALID_DATA) { 
          Timber.d("FAIL"); 
         } 

        } 
       }); 

因此,对于第一次正确地调用和登录成功,但是让说,如果我再次按下按钮,首先它打印在片段中的成功,然后再次将打印成功

任何想法,对这种不寻常行为。

回答

0

在阅读了MutableLiveData之后,这看起来像是它的自然行为,addSource将注册调用者,并且每次注册时都会执行onChanged。 所以我显然在MVVM做了一个小调查这件事做应用程序样本有一个叫新类SingleLiveEvent

生命周期感知观察到,经过 订阅只发送新的更新,用于像导航和小吃吧活动消息。

这避免了事件的常见问题:在配置更改 (如旋转)时,如果观察者处于活动状态,则可以发出更新。 如果有明确的调用 setValue()或call(),则此LiveData仅调用observable。

所以使用这个我设法完成它