0

我的应用程序与 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");
                        }

                    }
                });

因此,它第一次正确调用并记录成功,但可以说如果我再次按下按钮,最初它会在片段中打印成功,然后再次打印成功

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

4

1 回答 1

0

好吧,在阅读了 MutableLiveData 之后,这似乎是它的自然行为,addSource 将注册调用程序,并且 onChanged 将在您每次注册时执行。所以我对它做了一个小研究显然在 MVVM 中做应用程序示例有一个名为的新类SingleLiveEvent

一个生命周期感知的可观察对象,在订阅后只发送新的更新,用于导航和 Snackbar 消息等事件。

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

所以用这个我设法完成了

于 2017-08-25T04:50:46.830 回答