锁定方向,直到Asynctask完成

时间:2013-02-05 10:04:38

标签: android android-asynctask screen-orientation

只想在我的视图中加载所有数据之前阻止方向。所以我考虑了以下代码,但它不起作用。

private class task extends AsyncTask<String, Void, String> {

   protected String doInBackground(String... params) {
      ...
   }

   protected void onPostExecute(String result) {
      ...
      setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR);
   }

   protected void onPreExecute() {
      ...
      setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_NOSENSOR);
   }
}

当我运行SENSORNOSENSOR这两行时,我的屏幕会自动转为水平,而不理解原因。那可能会发生?

修改 我将以下行检查当前方向,结果如下:

   protected void onPreExecute() {
        if (getResources().getConfiguration().orientation==Configuration.ORIENTATION_LANDSCAPE) {
            Log.e("TAG","LANDSCAPE");
        }else{
            Log.e("TAG","PORTRAIT");
        }
      setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_NOSENSOR);
   }

Logcat的结果:

LANDSCAPE

但如果我删除这两行(SetRequestedOrientation),我会在logcat中得到这个:

PORTRAIT

3 个答案:

答案 0 :(得分:6)

只需将setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR);替换为setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);

即可

让我知道发生了什么......

入门级

 protected void onPreExecute() {
    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_NOSENSOR);
}

退出等级

 protected void onPostExecute(String result) {
      ...
     setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);
   }

<强>更新

有线行为(在您的情况下),但是,您可以使用任何方式获取当前方向,

int currentOrientation = getResources().getConfiguration().orientation; 

现在在onPreExecute() ..

中设置此方向

像,

protected void onPreExecute() {
  ...
  int currentOrientation = getResources().getConfiguration().orientation; 
   if (currentOrientation == Configuration.ORIENTATION_LANDSCAPE) {
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE);
   }
   else {
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_PORTRAIT);
   }
}

简单..: - )

答案 1 :(得分:0)

可能是一个错误,但也许更好的方法是锁定您的方向,这样您就不必担心正在创建的活动......或者更好。

在活动清单中使用此功能:

android:configChanges="orientation|screenSize|screenLayout"

然后您的活动不会在旋转时重新创建(同样,HoneyComb / 3.0活动也不会在旋转时重新创建)。

只需覆盖:

onConfigurationChanged(Configuration newConfig){
  //Handle new orientation
}

然后,您无需混淆用户在操作过程中手机停止旋转的原因。


如果你想要有生命的异步任务,也值得一看Robospice

答案 2 :(得分:0)

您这样做是因为您发现在活动销毁和重新创建期间您的异步任务被终止。我是对的吗?

处理此问题的正确方法是以在任务运行时锁定方向。我不同意setRequestedOrientation方法不起作用是一个错误;而不支持锁定活动方向然后从异步任务解锁的想法。

我已经解释了in some detail如何确保您的异步任务不会因为与您的活动生命周期取消关联而被杀死。回顾我提供的解决方案,我发现了更好的检查服务运行方式(进程间控制和绑定服务),但总体原则适用。以不明确android.app.Service的方向托管异步任务,并允许异步任务仅与服务和服务进行通信,以便仅与已绑定到它的那些活动进行通信。

我认为这是一种更标准的方法。