10

只想阻止方向,直到所有数据都加载到我的视图中。所以我想到了下面的代码,但它不起作用。

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);
   }
}

当我运行这两行SENSOR并且NOSENSOR我的屏幕自动变为水平时,不明白为什么。这可能正在发生?

编辑: 我输入以下几行来检查当前方向,结果如下:

   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
4

3 回答 3

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);
   }
}

简单的.. :-)

于 2013-02-05T10:08:03.147 回答
0

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

在活动清单中使用它:

android:configChanges="orientation|screenSize|screenLayout"

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

只需覆盖:

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

那么你就不需要让用户在操作过程中为什么手机停止旋转了。


如果您想要生命周期的异步任务,也值得一看Robospice 。

于 2013-02-05T10:12:06.513 回答
0

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

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

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

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

于 2013-02-05T10:30:21.857 回答