【问题标题】:Error while observing MutableLiveData观察 Mu​​tableLiveData 时出错
【发布时间】: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


【解决方案1】:

在将android.arch.lifecycle:extensions 更新到稳定版本 1.0.0 后,此问题已解决。现在,一切正常。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-06
    • 1970-01-01
    • 2014-07-25
    • 1970-01-01
    • 2018-01-10
    • 1970-01-01
    • 1970-01-01
    • 2014-02-24
    相关资源
    最近更新 更多