片段未附加到上下文 - 延迟的 UI 更改
Posted
技术标签:
【中文标题】片段未附加到上下文 - 延迟的 UI 更改【英文标题】:Fragment not attached to a context - Delayed UI changes 【发布时间】:2022-01-15 10:35:50 【问题描述】:我正在使用 Fragment,在特定的 Fragment 中,我需要在延迟后更改 UI。我在网上找到了一些允许我这样做的代码(使用 Timer + CoroutineScope 来触摸视图)。
timer.schedule(object : TimerTask()
override fun run()
MainScope().launch
withContext(Dispatchers.Default)
changeUI(requireContext())
, 800)
它可以完成工作,但我确信这不是最佳实践(我对编程比较陌生,所以请不要对它太苛刻)。问题是我需要将上下文传递给更改 UI 的方法,并且我偶尔会收到 IllegalStageException
,因为 Fragment 未附加到上下文。
知道如何解决这个问题吗?有没有更好的方法来处理 UI 中的延迟更改?
如果有任何帮助,我将不胜感激。谢谢!
【问题讨论】:
【参考方案1】:那是因为Fragment
s 跟随android lifecycle
,在lifecycle
中存在无法操纵其视图的状态。这通常发生在 Fragment
在屏幕上实际上不可见时。
timer.schedule(object : TimerTask()
override fun run()
MainScope().launch
withContext(Dispatchers.Default)
if(isAdded())
changeUI(requireContext())
, 800)
您可以通过调用isAdded()
来检查Fragment
是否处于有效状态以操纵其视图
【讨论】:
感谢您的回答!这样的状态会是什么?比如 onPause、onStop?您能否让我知道我使用的解决方案(计时器 + MainScope)是否是好的做法,或者我是否应该使用替代代码?谢谢!感谢您的帮助。 是的,这些是状态或阶段,只需在Android Lifecycle
上快速搜索一下。理想情况下,您需要一种Lifecyle
感知方法。这是一个使用 CountDownTimer
mahendranv.github.io/posts/timer 的例子,因为 Timer
和 CountDownTimer
是不同的,因此您必须将其调整为适合您当前的用例。它至少会给你一个提示,告诉你如何让 Lifecycle
意识到一些事情。您还可以将计时器粘贴在 ViewModel
中,并通过 LiveData
发布更改,observers
本身是 Lifecycle
知道的。以上是关于片段未附加到上下文 - 延迟的 UI 更改的主要内容,如果未能解决你的问题,请参考以下文章
java.lang.IllegalStateException:未附加到上下文的片段