Android 在运行异步任务时处理屏幕方向的更改
我已经被这个问题困扰了一段时间了。在运行单独的Android 在运行异步任务时处理屏幕方向的更改,android,android-asynctask,Android,Android Asynctask,我已经被这个问题困扰了一段时间了。在运行单独的线程/异步任务时,如何正确处理屏幕方向的更改?目前,我有 android:configChanges="orientation|keyboard|keyboardHidden" 在我的AndroidManifest.xml中,这是: 注意:应避免使用此属性,并仅作为最后手段使用。有关如何正确处理由于配置更改而重新启动的更多信息,请阅读处理运行时更改 此外,在2.3 emulator中,当切换到横向时,它工作,但切换回纵向失败 现在,我之所以使用co
线程
/异步任务
时,如何正确处理屏幕方向的更改?目前,我有
android:configChanges="orientation|keyboard|keyboardHidden"
在我的AndroidManifest.xml
中,这是:
注意:应避免使用此属性,并仅作为最后手段使用。有关如何正确处理由于配置更改而重新启动的更多信息,请阅读处理运行时更改
此外,在2.3 emulator中,当切换到横向
时,它工作,但切换回纵向
失败
现在,我之所以使用configChanges
,是因为当用户切换方向时,我可能有一个AsyncTask
正在运行,执行一些网络通信,我不希望它停止
有没有其他方法可以做到这一点,或者有没有方法修复2.3以切换回纵向
我知道
onretainonconfigurationinstance
,但我不确定“保存”AsyncTask
实例是否是一个好主意,主要是因为扩展AsyncTask
的类不是静态的(因此它与活动
)——而且它必须是静态的,因为在onPostExecute()中
它从活动
实例调用方法。我已经提出了类似的问题
基本上,在设备旋转时,存在如何暂停/恢复
AsynTask
的问题。但是,它仍然不适合所有情况(有时不可能安全地暂停操作,例如在远程服务器上创建新用户)。对于那些“不安全”的情况,您需要编写一些代码,我称之为棘手的“框架”。您将看到Commonware为github提供了一个链接。我遇到了与您类似的问题,并通过将AsyncTask
作为从类继承的类的一部分来实现,解决了这个问题。应用程序
类在应用程序的整个生命周期内都可用,因此您不必担心异步任务
被中断,除非整个应用程序都将被终止
要在任务完成时获得通知,必须实现一个接口,该接口用于将自身注册到应用程序
类
当您的应用程序由于屏幕旋转而被销毁时,您可以从应用程序
类中注销活动
,并在重新创建时重新注册。如果任务在销毁和重新创建之间完成,操作的结果可以同时存储在应用程序
类中,因此活动
可以检查任务是否仍在运行,或者在重新创建任务时结果是否已可用
另一个优点是您可以直接访问应用程序上下文,因为
应用程序
类是上下文
类的子类 看看droid fu库BetterAsyncTask
。这是为了处理这个确切的案件
因此,在重新启动
活动时,无法(轻松)保持异步任务
运行。真倒霉然而,我发现不切换回肖像是一个模拟器问题,因为设置应用程序也做同样的事情。非常好,比实现服务
简单得多。谢谢。@Flo我知道这篇文章发表已经有一段时间了,但我也在尝试这样做,但我不太明白你所说的“要在任务完成时得到通知,活动必须实现一个接口,它使用该接口将自己注册到应用程序类。”有没有可能举个例子?(我不熟悉java和android1)对不起,我没有代码示例。但是看一看,我希望你能理解我说的“注册”(update())和“通知”(addObserver())是什么意思。“Register”表示调用addObserver()方法,“notifying”表示调用update()。