【问题标题】:Android LiveData Observer after onPauseonPause 后的 Android LiveData Observer
【发布时间】:2019-06-13 11:35:48
【问题描述】:

接下来的问题是,我订阅了 LiveData 活动的变化,并且第一次在观察者中获取所有数据,但是当我开始另一个活动然后返回此活动时,观察者没有被调用。

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    viewModel = ViewModelProviders.of(this, viewModelFactory).get(MainMenuViewModel.class);

    observeViewModel();
}

@Override
protected void onResume() {
    super.onResume();

    viewModel.loadUserEntry();
}


public void observeViewModel() {

    viewModel.getUser().observe(this, userEntry -> {

        // Do some code 
    });
}

这是我的 ViewModel 的代码

void loadUserEntry() {

    disposable.add(userRepository.getUser()
            .subscribeOn(Schedulers.newThread())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(user::setValue, Throwable::printStackTrace));

}

public LiveData<UserEntry> getUser() {
    return user;
}

所以我测试并一直订阅我有用户价值,然后我将此值设置为 LiveData。

如果有人可以提供帮助,我将不胜感激。谢谢。

【问题讨论】:

  • 你能分享一下你的 setValue() 方法吗
  • @RishabhJain 这个扩展的lambda一次性.add(userRepository.getUser() .subscribeOn(Schedulers.newThread()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(value -> userLiveData.setValue( value), Throwable::printStackTrace));
  • 你定义了观察者吗? onChang 函数在哪里?检查这个:developer.android.com/topic/libraries/architecture/…
  • 也许一次性已经被丢弃了?你能显示你的disposable 的处理逻辑吗?

标签: android android-lifecycle android-architecture-components android-livedata android-jetpack


【解决方案1】:

看段"Observe LiveData objects"

通常,LiveData 仅在数据发生变化时才提供更新,并且只提供给活跃的观察者。这种行为的一个例外是观察者在从非活动状态变为活动状态时也会收到更新。此外,如果观察者第二次从非活动状态变为活动状态,则只有在自上次变为活动状态后值发生变化时,它才会收到更新。

在您的情况下,只要活动在后台堆栈中,viewmodel 就会存在。它导致LiveData 持有UserEntry 的实例,当您返回此活动并调用loadUserEntry() 时,它会加载相等(甚至相同)的UserEntry 实例。加载的实例等于前一个实例 -> LiveData 不会重新传递它。

【讨论】:

  • 谢谢,这就是答案。我将方法从 setValue 更改为 postValue。问题出在错误的方法上。 setValue():设置值。如果有活跃的观察者,值将被分派给他们。该方法必须从主线程调用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-19
  • 1970-01-01
相关资源
最近更新 更多