2013-02-05 38 views
10

只需要阻止方向,直到所有數據加載到我的視圖中。所以我想了下面的代碼,但它不起作用。鎖定方向,直到Asynctask完成

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 
+0

請檢查此問題http://stackoverflow.com/questions/3821423/background-task-progress-dialog-orientation-change-is-there-any-100-working/3821998#3821998 – Slartibartfast

回答

6

只是setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);

更換setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR);讓我知道發生什麼事..

入門級

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

簡單.. :-)

+0

感謝您的回答。同樣的問題,改變爲風景:S – jlopez

+0

其實,它爲你的工作時間相同的配置方向(鎖定)。 – user370305

+0

我編輯我的答案,你能看到嗎? – jlopez

0

可能是一個錯誤,但也許更好的方法是將eit她鎖定你的方向,所以你不必擔心正在創建的活動......或更好。

使用此在您的清單中的活動:

android:configChanges="orientation|screenSize|screenLayout" 

那麼你的活動是不是在重新旋轉(也可作爲蜂窩/ 3.0活動不會被重建上旋轉)。

只是覆蓋:

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

然後你不需要混淆爲什麼電話已經停止操作期間旋轉的用戶。


如果您想要進行生命週期異步任務,還值得看看Robospice

+0

屬性screenSize適用於Android 4.0.3。並且我使用的是Android 2.3.3 – jlopez

+1

這並不重要,我們總是建議您構建/定位最新API(在撰寫本文時爲17),然後設置最小值(如API8),這樣可以確保您的應用程序確實不能在新設備上以兼容模式運行。並且意味着您將標誌包含在其他50%的用戶之上。 –

0

你這樣做是因爲你發現你的異步任務在活動中被銷燬並重新創建。我對嗎?

處理此問題的正確方法是而不是可在您的任務正在運行時鎖定方向。我不同意setRequestedOrientation方法不起作用是一個錯誤;相反,鎖定活動方向然後從異步任務解鎖的想法不受支持。

我已經去解釋in some detail如何確保您的異步任務不會因爲將其與您的活動生命週期解除關聯而終止。回顧我提供的解決方案後,我發現了更好的檢查服務的方法(Inter Process Control和綁定服務),但總體原則適用。以不知道的方向託管異步任務android.app.Service並允許異步任務僅與服務和服務通信,以便僅與與其綁定的活動進行通信。

我認爲這是一個更標準的方法。

+0

他的解釋看起來很合理,但我可以付諸實踐嗎?我不太明白如何做到這一點 – jlopez

+0

閱讀[_bound_ services](http://developer.android.com/guide/components/bound-services.html)上的開發人員指南部分,然後看看使你的服務成爲[Intent service](http://developer.android.com/reference/android/app/IntentService.html) - 這種特殊類型的服務在底層的異步任務完成後會自行終止。這消除了相當數量的鍋爐板代碼 - 希望我早先發現它。 – OceanLife

+0

我希望我可以實施您的解決方案,但看起來很複雜,我沒有太多時間。 – jlopez