我的应用程序集成了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
对这种不寻常的行为有任何想法。
答案 0 :(得分:0)
在阅读MutableLiveData后,这似乎就像它的自然行为一样,addSource将注册调用者,每次注册时onChanged都会执行。
所以我做了一个关于它的小研究显然在MVVM做app应用样本有一个叫做SingleLiveEvent
的新类
生命周期感知的observable,仅在之后发送新的更新 订阅,用于导航和Snackbar消息等事件。
这避免了事件的常见问题:配置更改 (如旋转)如果观察者处于活动状态,则可以发出更新。 如果有明确的调用,则此LiveData仅调用observable setValue()或call()。
所以使用这个我设法完成它