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

4
在开发 Android 应用时,我构建了一个包含进度条的活动。有一个异步任务会在活动中更新进度条。但是,屏幕方向改变后,进度条不再更新,而异步任务仍在进行中。我认为异步任务没有引用在屏幕方向改变后 Android 在 onCreate 方法中创建的新进度条实例。如果有人能给我一些提示,我将不胜感激。谢谢。

你是否只调用了一次 findViewById(),在屏幕方向改变后可能会得到一个过时的引用? - mah
我认为异步任务没有引用新的进度条实例 - 也不应该这样做。你应该手动完成所有这些操作。 - user468311
3个回答

4

你是正确的,你的AsyncTask不知道新的活动实例,因为在方向更改期间,活动被销毁并重新创建。

但是有一个方法在方向更改时调用,你可以使用它来将AsyncTask传递给新的活动。

onRetainNonConfigurationInstance() 在活动被销毁之前调用,重写该方法并返回正在运行的AsyncTask的引用。然后,在onCreate()方法中,你可以通过调用getLastNonConfigurationInstance()来检索AsyncTask。请注意,你必须处理活动第一次创建的情况,getLastNonConfigurationInstance()将返回null。

此外,你必须将你的活动传递给AsyncTask,以便它可以引用当前活动的进度条。因此,我建议实现两种方法来向AsyncTask注册和注销活动。因此,在onRetainNonConfigurationInstance()中,你取消注册将被销毁的“旧”活动,在onCreate中,你将新创建的活动注册到新的AsyncTask或从getLastNonConfigurationInstance()检索到的AsyncTask中。


你能否更新你的答案以反映@SuperStubbs提供的新信息,指出这不是解决问题的可靠方法。 - Mike Vella

1
我知道这篇文章有些陈旧,事情可能已经发生了变化,但是Flo的答案不应该被接受。根据这里的文档:onRetainNonConfigurationInstance (),“此函数仅作为优化而调用,您不应依赖于它被调用”。
换句话说,如果你正在做一些重要的事情,并且那个“事情”在活动销毁时必须发生,那么这是一个不好的解决方案。
更好的解决方案是使用onSaveInstanceState(Bundle outState),可以在这里找到:onSaveInstanceState (Bundle outState)

0

从asynctask可能可以不直接引用ProgressBar,而是在activity的一个方法中更新progressbar。例如:

onPublishProgress(int progress) { 
    updateProgressBar(progress);
}

在活动中:

updateProgressBar(int progress) {
    progressBar.setProgress(progress);
}

你可以通过重写onSaveInstanceState()方法来保存Activity在被销毁前的状态。 在这里保存进度整数,然后在onCreate中检查savedInstanceState是否为null,如果不是,则创建进度条并设置为保存的整数值。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接