2017-08-24 64 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。

所以使用這個我設法完成它