2017-08-24 7 views
0

私のアプリケーションそれはViewModelにに来るとき、私は断片とオブザーバーを登録するMutableLiveDataを使用しているonChangedイベント機能は、第二アンドロイドMVVMでの通話

MVVM +改造+短剣と統合し、ViewModelに

は珍しい振る舞います

ビューがロードされると、ビューモデルが呼び出され、Webサービスが呼び出されます。onChnagedオブザーバの機能によってデータが破棄されますが、ボタンをクリックして同じ機能を呼び出すと、ここでコードサンプルが異常です。

それが適切に呼び出し、SUCCESSを記録したが、私はもう一度ボタンを押すと、最初はそれが再びフラグメントでSUCCESSを印刷し、それがSUCCESS

にこの珍しいのための任意のアイデアを出力言うことができます初めてだから、

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が実行されます。 だから私は、ナビゲーションやスナックバーなどのイベントのために使用さ 加入した後だけに新しいアップデートを送信し、ライフサイクルを意識し、観察SingleLiveEvent

と呼ばれる新しいクラスが、そこにあるアプリのサンプルを実行するためにMVVMでどうやらそれについての小さな研究を行いましたメッセージ。

これは、イベントの共通の問題を回避します。コンフィグレーションの変更時に、 (回転のような)オブザーバがアクティブな場合に更新を発行することができます。 このLiveDataは、 setValue()またはcall()への明示的な呼び出しがある場合にのみ、observableを呼び出します。

これを使用して、私はそれを達成しました。

関連する問題