2013-02-05 18 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); 
    } 
} 

私はSENSOR次の2行を実行し、NOSENSOR私の画面は、なぜ理解せず、自動的に横になります。それは起こっているかもしれませんか?

EDIT:Logcatの

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

結果: 私は次のような結果と現在の向きを確認するには、次の行を入れて

LANDSCAPE 

しかし、私は2を削除する場合行(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); 
    } 

更新:

onPreExecute()で、この方向を設定

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

有線(あなたの場合は)行動しかし、あなたが使用して現在の向きを取得することができますどのような方法..

と同様に、

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

おそらくバグかもしれませんが、もっと良い方法は、彼女はあなたのオリエンテーションをロックするので、作成されているアクティビティについて心配する必要はありません。

用途このアクティビティのためのマニフェストで:

android:configChanges="orientation|screenSize|screenLayout" 

次に、あなたの活動は、回転に再作成されていません(また、ハニカムのよう/ 3.0活動が回転に再作成されていません)。

だけ上書き:

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

は、その後、あなたが電話を運転中に回転が停止した理由を、ユーザーを混乱する必要はありません。


あなたはlifecyled非同期タスクをしたい場合は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)の開発者ガイドの部分を読んで見てくださいあなたのサービスを[インテントサービス](http://developer.android.com/reference/android/app/IntentService.html)にする - この特殊なタイプのサービスは、基盤となる非同期タスクが完了した後に自動的に終了します。これにより、私が以前に発見したかなりの量のボイラープレートのコードが削除されます。 – OceanLife

+0

私はあなたのソリューションを実装することができますが、それは複雑に思えますし、時間があまりありません。 – jlopez

関連する問題