在开发 Android 应用时,我构建了一个包含进度条的活动。有一个异步任务会在活动中更新进度条。但是,屏幕方向改变后,进度条不再更新,而异步任务仍在进行中。我认为异步任务没有引用在屏幕方向改变后 Android 在 onCreate 方法中创建的新进度条实例。如果有人能给我一些提示,我将不胜感激。谢谢。
你是正确的,你的AsyncTask不知道新的活动实例,因为在方向更改期间,活动被销毁并重新创建。
但是有一个方法在方向更改时调用,你可以使用它来将AsyncTask传递给新的活动。
onRetainNonConfigurationInstance() 在活动被销毁之前调用,重写该方法并返回正在运行的AsyncTask的引用。然后,在onCreate()方法中,你可以通过调用getLastNonConfigurationInstance()来检索AsyncTask。请注意,你必须处理活动第一次创建的情况,getLastNonConfigurationInstance()将返回null。
此外,你必须将你的活动传递给AsyncTask,以便它可以引用当前活动的进度条。因此,我建议实现两种方法来向AsyncTask注册和注销活动。因此,在onRetainNonConfigurationInstance()中,你取消注册将被销毁的“旧”活动,在onCreate中,你将新创建的活动注册到新的AsyncTask或从getLastNonConfigurationInstance()检索到的AsyncTask中。
onSaveInstanceState(Bundle outState)
,可以在这里找到:onSaveInstanceState (Bundle outState)。从asynctask可能可以不直接引用ProgressBar,而是在activity的一个方法中更新progressbar。例如:
onPublishProgress(int progress) {
updateProgressBar(progress);
}
在活动中:
updateProgressBar(int progress) {
progressBar.setProgress(progress);
}