Android从片段中删除活动观察器

时间:2019-07-22 08:55:03

标签: android kotlin android-livedata android-mvvm

我有MVVM单一活动应用程序,任务每x分钟运行一次。

Activity中,我正在观察该任务的结果。一切正常。

导航到某些Fragment之后,我想停止在Activity中观察它,而导航到另一个Fragment之后,再次观察(在活动中)。

观察活动的代码

    settingsViewModel.pb.observe(this, Observer {
        pb.visible(it)
    })

希望我已经把问题弄清楚了

4 个答案:

答案 0 :(得分:0)

为什么不改变观察者,而是在Activity上观察,如果该片段可见,则从Activity中对其进行更新。像这样:

settingsViewModel.pb.observe(this, Observer {
        if (currentFrag is yourFragment) {
            // currentFrag.doSomething()
        } else {
            pb.visible(it)
        }
    })

编辑1:

看看您的导航片段的primaryNavigationFragment属性,您可以在那里找到对其的引用:

val navHost = supportFragmentManager.findFragmentById(R.id.main_nav_fragment)
    navHost?.let { navFragment ->
        navFragment.childFragmentManager.primaryNavigationFragment?.let {currentFrag->
                // currentFrag.doSomething()
        }
    }
}

答案 1 :(得分:0)

您可以删除活动生命周期的所有观察者

settingsViewModel.pb.removeObservers(mActivity)

它将删除该实时数据的所有观察者。当再次移动到另一个片段时,您可以像执行操作一样设置新的观察者

settingsViewModel.pb.observe(this, Observer {
        pb.visible(it)
    })

答案 2 :(得分:0)

首先使用SharedViewModel在所有片段中建立视图模型,并观察所需每个片段中的实时数据。 然后在观察到livedata时调用您的活动方法。

fragment1 {
    sharedViewModel.pb.observe(viewLifecycleOwner, Observer {
        activityCallBack.someMethod()
    })
}

fragment2 {
    sharedViewModel.pb.observe(viewLifecycleOwner, Observer {
        activityCallBack.someMethod()
    })
}

答案 3 :(得分:0)

您需要做的就是

  override fun onDestroyView() {
    super.onDestroyView()
    viewModel.request.removeObservers(this)
}