簡體   English   中英

LiveData 從后台堆棧彈出后停用 Fragment 中的觀察者

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM