Observer中的onChanged函数MutableLive数据对于Android MVVM中的第二次调用表现异常

时间:2017-08-24 12:09:27

标签: android mvvm android-livedata

我的应用程序集成了MVVM +改装+匕首

当谈到ViewModel时,我使用MutableLiveData向Fragment和ViewModel注册观察者

因此,当视图加载时,它调用视图模型并调用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");
                        }

                    }
                });

所以这是第一次正确调用并记录SUCCESS,但是如果我再次按下按钮,最初它会在片段中打印SUCCESS然后再次打印SUCCESS

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

1 个答案:

答案 0 :(得分:0)

在阅读MutableLiveData后,这似乎就像它的自然行为一样,addSource将注册调用者,每次注册时onChanged都会执行。 所以我做了一个关于它的小研究显然在MVVM做app应用样本有一个叫做SingleLiveEvent的新类

  

生命周期感知的observable,仅在之后发送新的更新   订阅,用于导航和Snackbar消息等事件。

     

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

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