屏幕方向改变后Android进度条未更新

时间:2011-06-18 11:16:56

标签: android

在开发Android应用程序时,我构建了一个包含进度条的活动。 有一个异步任务将更新活动中的进度条。屏幕方向更改后,当异步任务仍在进行时,进度条不再更新。我相信异步任务不会引用在屏幕方向更改后android调用onCreate方法时创建的新进度条实例。

感谢是否有人可以向我显示任何提示。

感谢。

3 个答案:

答案 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,然后创建在保存的整数中设置的进度条。