Search code examples
androidandroid-asynctaskscreen-orientation

How to handle screen orientation changes when there is an asyntask running with android 4.x


I tried to implement the following code to handle screen orientation changes.

****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"/>

Those codes work perfectly with android 3.x or lower. However, it does not work properly for android 4.x.

Do you have any idea what the problem is??


Solution

  • Solution 1 – Think twice if you really need an AsyncTask.

    Solution 2 – Put the AsyncTask in a Fragment.

    Solution 3 – Lock the screen orientation

    Solution 4 – Prevent the Activity from being recreated.

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

    ..... the problem happens because the activity recreated when configuration changes,like orientation change etc. You can lock the orientation change in the onPreExecuted() method of asyntask and unlock it in the onPostExecuted() method.

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