Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/178.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 在运行异步任务时处理屏幕方向的更改_Android_Android Asynctask - Fatal编程技术网

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()。