在 AsyncTask 未结束之前如何防止旋转

How prevent rotation until AsyncTask is not ended

我注意到,如果我在 AsyncTask 为 运行 时尝试旋转设备,应用程序会崩溃。 这个 seems caused 事实上 Activity 在旋转中被破坏并重新创建。

为了避免这种情况,我想捕获旋转事件并仅在没有活动的 AsyncTasks 时执行它...如果有 AsyncTasks 处于活动状态,应用程序应该暂停旋转并在这些完成后执行。

我该怎么做?

重新设计您的应用并使用带有 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 不再是 运行.

,您可以添加类似的检查来解锁旋转