在开发Android应用程序时,我构建了一个包含进度条的活动。 有一个异步任务将更新活动中的进度条。屏幕方向更改后,当异步任务仍在进行时,进度条不再更新。我相信异步任务不会引用在屏幕方向更改后android调用onCreate方法时创建的新进度条实例。
感谢是否有人可以向我显示任何提示。
感谢。
答案 0 :(得分:4)
您的答案正确您AsyncTask不知道活动的新实例,因为活动在方向更改期间被销毁并重新创建。
但是有一种方法可以在方向改变时被调用,并且可以用来将AsyncTask传递给新活动。
在活动被销毁之前调用onRetainNonConfigurationInstance(),覆盖该方法并返回正在运行的AsyncTask的引用。在onCreate()方法中,您可以检查由于调用getLastNonConfigurationInstance()而导致的AsyncTask。请注意,您必须处理第一次创建活动的情况,并且getLastNonConfigurationInstance()将返回null。
此外,您必须将您的活动传递给AsyncTask,以便它可以引用当前活动的进度条。因此,我建议实现两种方法来注册和注销AsyncTask中的活动。因此,在onRetainNonConfigurationInstance()中,您取消注册将被销毁的“旧”活动,并在onCreate中将新创建的活动注册到新的AsyncTask或从getLastNonConfigurationInstance()中检索的活动。
答案 1 :(得分:1)
我知道这是旧的,事情可能已经改变,但弗洛的回答不应该是被接受的。根据此处的文档:onRetainNonConfigurationInstance ()
“这个函数纯粹被称为优化,你不能依赖它被调用。”
换句话说,如果你正在做一些重要的事情,并且当活动被破坏时必须发生“事情”,这是一个糟糕的解决方案。
更好的解决方案是使用此处的onSaveInstanceState(Bundle outState)
:onSaveInstanceState (Bundle outState)
答案 2 :(得分:0)
从asynctask可能而不是直接引用ProgressBar,您可以在活动的方法中更新进度条。例如
onPublishProgress(int progress) {
updateProgressBar(progress);
}
活动中的:
updateProgressBar(int progress) {
progressBar.setProgress(progress);
}
您可以通过覆盖onSaveInstanceState()来保存活动状态,然后再将其保存。 将进度整数保存在此处,然后保存在onCreate中, 检查savedInstanceState是否为null,然后创建在保存的整数中设置的进度条。