我一直在寻找许多论坛讨论,但没有一个能够正确回答如何处理强制实际活动重启的运行时更改。
在我的情况下,例如,我的活动使用AsyncTask在从服务器获取数据时显示ProgressBar。但是,如果用户只是旋转屏幕,则重新启动活动并重复向服务器发送请求。
如果在AsyncTask仍处于doInBackground()状态时完成屏幕旋转,等待服务器的响应,则会收到android.view.WindowLeaked错误。
我只是想,无论何时屏幕旋转或发生其他中断,我的活动都会继续从它停止的位置开始工作,这可能会很难吗?
建议使用onSaveInsanceState()?如何在Bundle中保存部分接收的JSON?或者我应该使用onRetainNonConfigurationInstance()...
会送一瓶巴西人的饮料“caipirinha”给善良的灵魂帮助我......
答案 0 :(得分:0)
您需要使用不同的架构。
将后台操作从AsyncTask移动到服务中。服务在后台独立于任何活动运行,并且在您更改设备的方向时不会重新启动。
后台服务可以通过广播与前台活动进行通信。在服务中,您可以使用sendBroadcast()发送带有进度信息的广播。您可以使用BroadcastReceiver在活动中接收广播。
编辑:根据您的具体情况,可能适合的不太激烈的方法,请参阅: http://developer.android.com/guide/topics/resources/runtime-changes.html。特别是,如果您不使用不同的横向和纵向资源,那么第二种方法(自己处理配置更改)可能会很好。
EDIT2:这里有一些额外的信息: Activity restart on rotation Android