首页 > 解决方案 > onPause 后的 Android LiveData Observer

问题描述

接下来的问题是,我订阅了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。

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

标签: androidandroid-lifecycleandroid-architecture-componentsandroid-livedataandroid-jetpack

解决方案


看看“观察 LiveData 对象”段落:

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

在您的情况下,只要活动在后台堆栈中,视图模型就会存在。当您返回此活动并称LiveData其为. 加载的实例等于前一个实例 ->不重新传递它。UserEntryloadUserEntry()UserEntryLiveData


推荐阅读