在 AsyncTask 未结束之前如何防止旋转
How prevent rotation until AsyncTask is not ended
我注意到,如果我在 AsyncTask
为 运行 时尝试旋转设备,应用程序会崩溃。
这个 seems caused 事实上 Activity
在旋转中被破坏并重新创建。
为了避免这种情况,我想捕获旋转事件并仅在没有活动的 AsyncTask
s 时执行它...如果有 AsyncTask
s 处于活动状态,应用程序应该暂停旋转并在这些完成后执行。
我该怎么做?
重新设计您的应用并使用带有 setRetainInstance(true)
的片段。将 AsyncTask 放入片段中。在这种情况下,这是正确的做法。
无法暂停屏幕旋转。您只能在 activity 清单条目中使用 configChanges 完全停止它(但这是不好的做法)。你应该做的是把你的异步任务放在保留的片段中。直到最近,您还可以使用 Activity.getLastNonConfigurationInstance and Activity.onRetainNonConfigurationInstance 在 Activity 被销毁和重新创建之间保持对 AsyncTask 的引用,但现在它已被弃用。但是你仍然可以使用它。
阅读此处了解更多信息:http://developer.android.com/reference/android/app/Activity.html#onRetainNonConfigurationInstance()
另外:
if I try to rotate the device during AsincTask the App crashes
这实际上不应该发生,您可能会在 AsyncTask 中保留对您的 Activity 的引用,并在它被销毁后使用它。这称为参考泄漏。为避免它在 WeakReference 中保留对您的 Activity 的引用,如果您的 AsyncTask 是内部 class,则将其设为静态。如果可能,请在 Activity.onDestroy 中销毁您的异步任务 - 通过取消它,在异步任务中检查它是否被取消并停止处理。如果你用它来下载东西然后考虑保留片段或 IntentService。
不要那样做。相反,通过方向改变正确处理一切。
一个工人 Fragment
里面有一个 AsyncTask
是一个很好的解决方案。
片段保持跨越方向变化,因此任务不会被打断,并始终通过片段的 getActivity()
.
报告给正确的 Activity
本教程准确地展示了如何做到这一点
http://www.androiddesignpatterns.com/2013/04/retaining-objects-across-config-changes.html
您可以检查您的 AsyncTask
是否为 运行,如果是,请阻止应用程序旋转。像这样的事情就可以了:
if (myAsyncTask.getStatus() == AsyncTask.Status.RUNNING)
{
if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT)
{
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}
else
{
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
}
}
以上代码将检查您 AsyncTask
是否为 运行,如果是,则获取当前屏幕方向并将其锁定。如果 AsyncTask
不再是 运行.
,您可以添加类似的检查来解锁旋转
我注意到,如果我在 AsyncTask
为 运行 时尝试旋转设备,应用程序会崩溃。
这个 seems caused 事实上 Activity
在旋转中被破坏并重新创建。
为了避免这种情况,我想捕获旋转事件并仅在没有活动的 AsyncTask
s 时执行它...如果有 AsyncTask
s 处于活动状态,应用程序应该暂停旋转并在这些完成后执行。
我该怎么做?
重新设计您的应用并使用带有 setRetainInstance(true)
的片段。将 AsyncTask 放入片段中。在这种情况下,这是正确的做法。
无法暂停屏幕旋转。您只能在 activity 清单条目中使用 configChanges 完全停止它(但这是不好的做法)。你应该做的是把你的异步任务放在保留的片段中。直到最近,您还可以使用 Activity.getLastNonConfigurationInstance and Activity.onRetainNonConfigurationInstance 在 Activity 被销毁和重新创建之间保持对 AsyncTask 的引用,但现在它已被弃用。但是你仍然可以使用它。
阅读此处了解更多信息:http://developer.android.com/reference/android/app/Activity.html#onRetainNonConfigurationInstance()
另外:
if I try to rotate the device during AsincTask the App crashes
这实际上不应该发生,您可能会在 AsyncTask 中保留对您的 Activity 的引用,并在它被销毁后使用它。这称为参考泄漏。为避免它在 WeakReference 中保留对您的 Activity 的引用,如果您的 AsyncTask 是内部 class,则将其设为静态。如果可能,请在 Activity.onDestroy 中销毁您的异步任务 - 通过取消它,在异步任务中检查它是否被取消并停止处理。如果你用它来下载东西然后考虑保留片段或 IntentService。
不要那样做。相反,通过方向改变正确处理一切。
一个工人 Fragment
里面有一个 AsyncTask
是一个很好的解决方案。
片段保持跨越方向变化,因此任务不会被打断,并始终通过片段的 getActivity()
.
Activity
本教程准确地展示了如何做到这一点 http://www.androiddesignpatterns.com/2013/04/retaining-objects-across-config-changes.html
您可以检查您的 AsyncTask
是否为 运行,如果是,请阻止应用程序旋转。像这样的事情就可以了:
if (myAsyncTask.getStatus() == AsyncTask.Status.RUNNING)
{
if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT)
{
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}
else
{
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
}
}
以上代码将检查您 AsyncTask
是否为 运行,如果是,则获取当前屏幕方向并将其锁定。如果 AsyncTask
不再是 运行.