如何在FragmentManager中避免种族状况



我的目标是在片段堆栈中只允许同一对话框片段的一个实例。

当前触发条件来自SharedFlow,并且可以与值之间的7ms一样频繁地触发。

以下是我尝试过的:

  1. 将代码放置在synchronized块中
  2. 通过调用fm.findFragmentByTag检查堆栈中是否存在现有片段

但是,这两个条件都不足以阻止片段多次添加到fragmentManager。

我试过dialogFragment.showNow(fm, tag),但它不稳定,正在崩溃

感谢您的帮助。


override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
viewModel.someSharedFlow
.flowWithLifecycle(viewLifecycleOwner.lifecycle)
.onEach { showMyFragmentDialog() }
.launchIn(viewLifecycleOwner.lifecycleScope)
}
private fun showMyFragmentDialog() {
synchronized(childFragmentManager) {
if (childFragmentManager.findFragmentByTag(MyFragment.TAG) == null) {
MyFragment.newInstance(fuelTypes)
.show(childFragmentManager, MyFragment.TAG)
}
}
}

目前已使用协同程序解决。不理想,但至少它起作用了。

private var myLaunchJob: Job? = null
private fun showMyFragmentDialog() {
if (myLaunchJob?.isActive == true) return
myLaunchJob = viewLifecycleOwner.lifecycleScope.launch {
if (childFragmentManager.findFragmentByTag(MyFragment.TAG) == null) {
MyFragment.newInstance(fuelTypes)
.show(childFragmentManager, MyFragment.TAG)
}
// Act as debouncer
delay(1000)
}
}

相关内容

  • 没有找到相关文章

最新更新