【问题标题】:How to handle screen orientation changes when there is an asyntask running with android 4.xandroid 4.x 运行异步任务时如何处理屏幕方向变化
【发布时间】:2012-07-24 12:07:40
【问题描述】:

我尝试实现以下代码来处理屏幕方向更改。

****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。

你知道问题出在哪里吗?

【问题讨论】:

    标签: android android-asynctask screen-orientation


    【解决方案1】:

    同时添加screenSize 值。

    来自documentation

    注意:如果您的应用程序以 API 级别 13 或更高级别为目标(由 minSdkVersion 和 targetSdkVersion 属性声明),那么 您还应该声明 screenSize 配置,因为它 当设备在纵向和横向之间切换时也会发生变化 方向。

    因此,清单应如下所示(如果您想自己处理方向更改):

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

    【讨论】:

      【解决方案2】:

      解决方案 1 – 如果您真的需要 AsyncTask,请三思。

      解决方案 2 – 将 AsyncTask 放入片段中。

      解决方案 3 – 锁定屏幕方向

      解决方案 4 – 阻止重新创建 Activity。

      参考: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();
      }
      
      
      
      
      }
      

      【讨论】:

        【解决方案3】:

        我不能 100% 确定这会起作用,但您可以尝试使用 onNonConfigurationChangedInstance() 保存您的 AsyncTask。

        // 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
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-06-13
          • 1970-01-01
          • 2014-04-14
          • 1970-01-01
          相关资源
          最近更新 更多