当使用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或更低的完美工作。 但是,它不适用于Android 4.x.

你有什么想法是什么问题?

Solutions Collecting From Web of "当使用android 4.x运行asyntask时,如何处理屏幕方向的变化"

解决scheme1 ​​ – 如果您真的需要一个AsyncTask,请考虑一下。 解决scheme2 – 把AsyncTask放在一个片段中。 解决scheme3 – locking屏幕方向解决scheme4 – 防止重新创build活动。

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

…..问题发生是因为在configuration更改(如方向更改等)时重新创build活动。您可以lockingasyntask的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(); } } 

添加screenSize值。

从文档 :

注意 :如果您的应用程序的目标API级别为13或更高(由minSdkVersion和targetSdkVersion属性声明),则还应声明screenSizeconfiguration,因为当设备在纵向和横向之间切换时,configuration也会更改。

所以,manifest应该看起来像这样(如果你想自己处理方向的变化):

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

我不是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 }