Jan*_*usz 86 android screen-rotation android-asynctask
我读了很多关于如何保存我的实例状态或如何在屏幕旋转期间处理我的活动被破坏的内容.
似乎有很多可能性,但我还没有想出哪一个最适合检索AsyncTask的结果.
我有一些AsyncTasks只是再次启动并调用isFinishing()活动的方法,如果活动正在完成,他们不会更新任何东西.
问题是我有一个任务对Web服务发出请求失败或成功的任务,并且重新启动任务会导致用户的经济损失.
你怎么解决这个问题?可能的解决方案有哪些优点或缺点?
Rom*_*Guy 46
您可以AsyncTask在code.google.com/p/shelves查看我如何处理和方向更改.有多种方法可以做到这一点,我在这个应用程序中选择的方法是取消当前正在运行的任务,保存其状态并在Activity创建新状态时启动具有已保存状态的新状态.它很容易做到,效果很好,作为奖励,它会在用户离开应用程序时停止执行任务.
你也可以onRetainNonConfigurationInstance()用来传递你AsyncTask的新东西Activity(注意不要以前Activity这种方式泄漏.)
Vit*_*nko 10
这是我见过的关于Android的最有趣的问题!!! 实际上我在过去几个月里一直在寻找解决方案.还是没有解决.
小心,简单地覆盖
android:configChanges="keyboardHidden|orientation"
Run Code Online (Sandbox Code Playgroud)
东西还不够.
考虑用户在AsyncTask运行时接到电话的情况.您的请求已由服务器处理,因此AsyncTask正在等待响应.在这一刻你的应用程序进入后台,因为手机应用程序刚刚进入前台.操作系统可能会杀死您的活动,因为它在后台.
我的第一个建议是确保您确实需要在屏幕旋转时重置您的活动(默认行为).每次我遇到旋转问题时我都会<activity>在AndroidManifest.xml中将此属性添加到我的标签中,并且很好.
android:configChanges="keyboardHidden|orientation"
Run Code Online (Sandbox Code Playgroud)
它看起来很奇怪,但是onConfigurationChanged()如果你不提供它,它会把它交给你的方法,除了重新测量布局之外别无其他任何事情,这似乎是在大多数时候处理旋转的完美的方法.
为什么不总是在Android提供的Singleton上保留对当前AsyncTask的引用?
每当任务开始时,在PreExecute或构建器上,您都定义:
((Application) getApplication()).setCurrentTask(asyncTask);
只要它完成,您将其设置为null.
这样你总有一个参考,允许你做一些像onCreate或onResume这样的东西,用于你的特定逻辑:
this.asyncTaskReference = ((Application) getApplication()).getCurrentTask();
如果它为null,你知道目前没有运行!
:-)
最正确的方法是使用片段来保留异步任务的实例,通过旋转。
这是一个非常简单示例的链接,可以轻松地将这种技术集成到您的应用程序中。
https://gist.github.com/daichan4649/2480065