2

我一直在查看许多论坛讨论,但没有一个正确回答如何处理迫使实际活动重新启动的运行时更改。

例如,在我的情况下,我的活动使用 AsyncTask 在从服务器获取数据时显示 ProgressBar。但是,如果用户只是旋转屏幕,活动将重新启动并重复对服务器的请求。

如果在 AsyncTask 仍在 doInBackground() 中时完成屏幕旋转,等待服务器响应,我会收到 android.view.WindowLeaked 错误。

我只是想,每当屏幕旋转或发生其他中断时,我的活动从停止的地方继续工作,这会很难吗?

建议使用 onSaveInsanceState() 吗?如何将部分接收的 JSON 保存在 Bundle 中?或者也许我应该使用 onRetainNonConfigurationInstance()...

会送一瓶巴西人的饮料“caipirinha”给帮助我的好灵魂...

4

1 回答 1

0

您需要使用不同的架构。

将后台操作从 AsyncTask 移到服务中。服务在后台独立于任何 Activity 运行,并且在您更改设备的方向时不会重新启动。

后台 Service 可以通过广播与前台 Activity 进行通信。在服务中,您可以使用 sendBroadcast() 发送带有进度信息的广播。您可以使用 BroadcastReceiver 在 Activity 中接收广播。

编辑:对于根据您的情况可能适合的不太激烈的方法,请参阅:http: //developer.android.com/guide/topics/resources/runtime-changes.html。特别是,如果横向和纵向不使用不同的资源,那么第二种方法(自己处理配置更改)可能会很好。

EDIT2:这里的一些附加信息: Activity restart on rotation Android

于 2012-06-17T01:15:33.390 回答