[英]LiveData deactivates observer in Fragment after popping it up from backstack
每次用戶訪問HomeFragment
時,我都需要執行一項任務。 它是新創建的還是用戶返回到這個Fragment
都沒有關系。
新創建時它工作正常,但是當從后堆棧返回時,不會調用觀察者。 我使用調試器發現LiveData
有觀察者,但hasActiveObservers()
返回 false 。 我試圖從不同的生命周期回調中操作和觀察/刪除觀察者,但沒有成功。 在谷歌中也找不到明確的解釋。
這是我的HomeFragment.java
:
public class HomeFragment extends BaseFragment {
//.......
private ImportViewModel viewModel;
private Observer<State> observer = state -> {
//update UI depending on a state
};
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
viewModel = ViewModelProviders.of(this, viewModelFactory).get(ImportViewModel.class);
observeViewModel();
}
@Override
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.fragment_home, container, false);
//execute here since onCreate() is not called when coming from backstack
viewModel.importFile();
return v;
}
@Override
public void onDestroy() {
super.onDestroy();
viewModel.liveDataState.removeObserver(observer);
}
private void observeViewModel() {
viewModel.liveDataState.observe(this, observer);
}
//.......
}
並ImportViewModel.java
public class ImportViewModel extends ViewModel {
//......
public MutableLiveData<State> liveDataState = new MutableLiveData<>();
//......
public void importFile(){
disposables.add(repository.importFile()
.subscribeOn(subscribeOnScheduler)
.observeOn(observeOnScheduler)
.subscribe(this::onNext, this::onError, this::onComplete));
}
private void onNext(SomeResponse resp){
liveDataState.setValue(new State(resp));
}
private void onError(Throwable t){
liveDataState.setValue(new ErrorState(t.getMessage()));
}
private void onComplete(){
liveDataState.setValue(new CompleteState());
}
}
為什么觀察者變得不活躍?
我有類似的問題。 我的情況是我要從主片段轉到另一個片段,我通過將片段視圖設置為全局和在創建視圖方法中維護片段狀態,我首先檢查視圖是否為空然后不設置任何內容。 一直工作正常。
我的問題是當我從那個片段回來時,沒有觀察到實時數據的變化。
我設法通過這種方式在 onResume 方法中做到了。
private fun setupObserver() {
val observer: Observer<MutableList<Post>> = Observer {
// textView.text = homeViewModel.text.value?.get(0)?.name ?: "Loading"
Log.d(
AppConstants.GLOBAL_LOGTAG,
"observed with current page = ${homeViewModel.getMetaData().currentPage}"
)
//logic to show progress
if (!isObservedAtLeastOneTime) {
showProgress()
}
if (homeViewModel.getMetaData().currentPage == 1) {
list.clear()
list.addAll(homeViewModel.mutableLiveData.value!!)
recentPostsAdapter.notifyDataSetChanged()
} else {
list.clear()
list.addAll(homeViewModel.mutableLiveData.value!!)
recentPostsAdapter.notifyDataSetChanged()
}
if (isObservedAtLeastOneTime) {
hideProgressAndShowContent()
}
isObservedAtLeastOneTime = true
isLoading = false
swipeRefreshLayout.isRefreshing = false
}
if (!homeViewModel.mutableLiveData.hasActiveObservers()) {
homeViewModel.mutableLiveData.observe(viewLifecycleOwner, observer)
}
}
並在恢復方法中。
override fun onResume() {
super.onResume()
if(!homeViewModel.mutableLiveData.hasActiveObservers()){
setupObserver()
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.