【发布时间】:2018-03-14 23:17:08
【问题描述】:
我正在开发一个 MVVM 应用程序。我已经能够同时使用 AndroidViewModel、Activity 和 MutableLiveData,但我不知道为什么我对这个特定方法有问题。
例如,我有一个名为“IssuesViewModel”的 AndroidViewModel。它有一个private MutableLiveData<Boolean> mutable; 和这两种方法:
// Retrofit 2 call
public void reportIssue(Data data){
mutable = new MutableLiveData();
retrofit.reportIssue(Data data, new RestCallback<Void>(){
@Override
public void success(Void success){
mutable.setValue(true);
}
@Override
public void failure(){
mutable.setValue(false);
}
);
}
// Getting mutableLiveData
public MutableLiveData<Boolean> getMutable(){
return mutable;
}
现在,在我的“IssuesActivity”中,即扩展AppCompatActivity 并实现LifecycleRegistryOwner,我有以下方法:
//... Activity callbacks and other methods ...
private IssuesViewModel viewModel;
@Override
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState)
// Toolbar code and other stuff...
viewModel = ViewModelProviders.of(this).get(IssuesViewModel.class);
// More code ...
}
@Override
public LifecycleRegistry getLifecycle() {
return new LifecycleRegistry(this);
}
// Triggered after button click
private void reportIssue(Data data){
viewModel.reportIssue(data);
viewModel.getMutable().observe(this, new Observer<Boolean>(){
@Override
public void onChanged(@Nullable Boolean response){
if (response != null && response){
//Success, update UI
} else {
//Error, update UI
}
}
}
我之前已经能够使用 mutableLiveData(使用自定义对象而不是布尔值)。我以前的所有电话都这样做了...我不知道为什么这不起作用。
谢谢!
编辑 1,11 月 21 日:
我认为问题在于我的活动扩展了AppCompatActivity 并实现了LifecycleRegistryOwner。我有一个 Activity,其代码与上述代码相似,一切正常,但该 Activity 正在扩展LifecycleActivity。当我更改此活动时,扩展 AppCompatActivity 并实施LifecycleRegistryOwner,观察者的 onChange 永远不会触发。我发现这个 bug 与我的问题有关,但我认为它只适用于 Fragments...
【问题讨论】:
-
是on changed没有调用的问题吗?也可以代替 getMutable(),在 reportIssue() 上返回可变而不是 void
-
是的,出于某种原因,onChanged 永远不会被调用...我尝试在
reportIssue()上返回 mutable 但我没有工作 -
每次调用
reportIssue时,mutable的值都会设置为新值,但您的活动客户端可能会使用旧值 - 只需在视图模型中的一个位置初始化mutable = new MutableLiveData(); -
我把它放在 IssuesViewModel 的构造函数中,但它也不起作用@pskink
-
这个问题似乎是因为@pskink提到的原因而发生的。我制作了一个示例应用程序来演示带有常用库的 MVVM,这里 github.com/dgngulcan/nytclient-android 你可以查看它。
标签: java android mvvm retrofit2 rx-java2