2012-07-24 4 views
9

画面の向きの変更を処理する次のコードを実装しようとしました。android 4.xで動作するasyntaskがある場合の画面の向きの変更方法

****DataBaseUpdateService.java**** 

public class DataBaseUpdateService extends Activity { 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     Updatetask Task = new Updatetask(this.getApplicationContext()); 
      if(Task.getStatus() == AsyncTask.Status.PENDING){ 
      Task.execute();}; 
    } 

    @Override 
    public void onConfigurationChanged(Configuration newConfig) { 
     super.onConfigurationChanged(newConfig); 
    } 

    @Override 
    public void onPause() { 
     super.onPause(); 
    } 

    @Override 
    public void onResume() { 
     super.onResume(); 
    } 
} 

=========================================== ===============================

****Androidmanifest.xml**** 
<activity 
    android:name=".DataBaseUpdateService" 
    android:configChanges="keyboardHidden|orientation"/> 

これらのコードは、Android 3.xまたは下で完全に動作します。しかし、アンドロイド4.xでは正しく動作しません。

問題は何ですか?

答えて

2

解決策1 - 実際にAsyncTaskが必要な場合は2回考えます。 ソリューション2 - AsyncTaskをフラグメントに配置します。 解決策3 - 画面の向きをロックする 解決策4 - アクティビティを再作成しないようにします。

参考:http://androidresearch.wordpress.com/2013/05/10/dealing-with-asynctask-and-screen-orientation/

..... 活動を再作成ため、問題が発生したときにあなたがasyntaskの姿勢onPreExecutedの変化()メソッドをロックし、ロックを解除することができます 姿勢の変化などのような構成の変更、それはonPostExecuted()メソッドにあります。

import android.app.Activity; 
import android.content.Context; 
import android.content.pm.ActivityInfo; 
import android.content.res.Configuration; 
import android.os.AsyncTask; 
import android.widget.Button; 
import android.widget.ProgressBar; 

public class MyAsyncTask extends AsyncTask<Void, Integer, Void> { 
private Context context; 
private ProgressBar progressBar; 
private Button button; 

public MyAsyncTask(ProgressBar progressBar,Context context,Button button){ 
    this.context=context; 
    this.progressBar=progressBar; 
    this.button=button; 

} 

private void lockScreenOrientation() { 
    int currentOrientation =context.getResources().getConfiguration().orientation; 
    if (currentOrientation == Configuration.ORIENTATION_PORTRAIT) { 
     ((Activity) 
    context).setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 
    } else { 
     ((Activity) context). 
    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); 
    } 
} 

private void unlockScreenOrientation() { 
    ((Activity) context). 
    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR); 
} 

@Override 
protected void onPreExecute() { 
    // TODO Auto-generated method stub 
    super.onPreExecute(); 
    progressBar.setMax(100); 
    button.setEnabled(false); 
    lockScreenOrientation(); 
} 

@Override 
protected Void doInBackground(Void... params) { 
    // TODO Auto-generated method stub 


    for(int i=0;i<=100;i++){ 
    try { 
     Thread.sleep(200); 
    } catch (InterruptedException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
    publishProgress(i); 

    } 

return null; 
} 
@Override 
protected void onProgressUpdate(Integer... values) { 
    // TODO Auto-generated method stub 
    super.onProgressUpdate(values); 
    progressBar.setProgress(values[0]); 
} 
@Override 
protected void onPostExecute(Void result) { 
    // TODO Auto-generated method stub 
    super.onPostExecute(result); 
    button.setEnabled(true); 
    unlockScreenOrientation(); 
} 




} 
+0

ありがとうございました。 –

27

screenSizeの値も追加します。 documentationから

:アプリケーション・ターゲットのAPIレベル13以上(minSdkVersionが及びtargetSdkVersion属性によって宣言される)場合は、 あなたもそれので、screenSize設定を宣言する必要があります デバイスがポートレートとランドスケープの間で切り替わるときにも変化します だから、

、(あなたが方向を処理したい場合は、自分自身を変更する)次のようになります。マニフェスト:

****Androidmanifest.xml**** 
<activity 
    android:name=".DataBaseUpdateService" 
    android:configChanges="keyboardHidden|orientation|screenSize"/> 
+1

ありがとう...私は – Eric

+0

おかげでたくさんの画面サイズを追加することで問題を解決するため、あなたは –

+0

おかげで男に私の時間を節約し、あなたが私の一日保存しました。 –

0

私はこれが動作することを100%わからないんだけど、あなたはAsyncTaskを保存しようとすることができonNonConfigurationChangedInstance()を使用します。

// Declare a member variable 
private UpdateTast task; 

public void onCreate(){ 

    // Attempt to get the asynctask instance 
    task=(UpdateTask)this.getLastNonConfigurationInstance(); 

    // If it's null create a new instance 
    if(task==null){ 
     task = new Updatetask(this.getApplicationContext()); 
     task.execute(). 

    } 

    // If it is not null, then the reference returned by getLastNonConfigurationInstance(); will be used. 
} 

// And lastly override onRetainNonConfigurationInstance method: 
@Override 
public Object onRetainNonConfigurationInstance() {   
    return task 
} 
関連する問題