【问题标题】:How prevent rotation until AsyncTask is not ended在 AsyncTask 未结束之前如何防止旋转
【发布时间】:2015-01-17 16:26:02
【问题描述】:

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

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

我怎么能这样做?

【问题讨论】:

    标签: android android-activity android-asynctask


    【解决方案1】:

    无法暂停屏幕旋转。您只能在活动清单条目中使用 configChanges 完全停止它(但这是不好的做法)。您应该做的是将您的异步任务放在保留的片段中。直到最近,您还可以使用 Activity.getLastNonConfigurationInstanceActivity.onRetainNonConfigurationInstance 在 Activity 被销毁和重新创建之间保持对 AsyncTask 的引用,但现在它已被弃用。但是你仍然可以使用它。

    阅读此处了解更多信息:http://developer.android.com/reference/android/app/Activity.html#onRetainNonConfigurationInstance()

    还有:

    如果我在 AsincTask 期间尝试旋转设备,应用会崩溃

    这实际上不应该发生,您可能会在 AsyncTask 中保留对 Activity 的引用并在它被销毁后使用它。这称为参考泄漏。为了避免它在 WeakReference 中保留对您的 Activity 的引用,如果您的 AsyncTask 是一个内部类,则将其设为静态。如果可能,请在 Activity.onDestroy 中销毁您的异步任务 - 通过取消它,在异步任务中检查它是否被取消并停止处理。如果你用它来下载东西,那么考虑保留片段或 IntentService。

    【讨论】:

      【解决方案2】:

      重新设计您的应用并使用带有setRetainInstance(true) 的片段。将您的 AsyncTask 放入片段中。在这种情况下,这是正确的做法。

      【讨论】:

        【解决方案3】:

        不要那样做。相反,通过改变方向正确处理所有事情。

        带有AsyncTask 的工人Fragment 是一个很好的解决方案。 片段在方向变化时保持不变,因此任务不会被中断,并且始终通过片段的getActivity() 向正确的Activity 报告。

        本教程准确地展示了如何做到这一点 http://www.androiddesignpatterns.com/2013/04/retaining-objects-across-config-changes.html

        【讨论】:

          【解决方案4】:

          您可以检查您的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 不再运行,您可以添加类似的检查来解锁旋转。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-10-19
            • 1970-01-01
            • 2011-10-12
            • 1970-01-01
            相关资源
            最近更新 更多