Как обрабатывать изменения ориентации экрана, когда выполняется асинхронная задача с Android 4.x

Я попытался реализовать следующий код для обработки изменений ориентации экрана.

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

Ты хоть представляешь в чем проблема??

3 ответа

Решение

Решение 1. Подумайте дважды, действительно ли вам нужна AsyncTask. Решение 2 - Поместите AsyncTask во фрагмент. Решение 3 - Заблокируйте ориентацию экрана. Решение 4 - Предотвратите повторение действия.

Ссылка: http://androidresearch.wordpress.com/2013/05/10/dealing-with-asynctask-and-screen-orientation/

..... проблема возникает из-за того, что действие воссоздается при изменении конфигурации, например при изменении ориентации и т. д. Вы можете заблокировать изменение ориентации в методе onPreExecuted() asyntask и разблокировать его в методе 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), вам также следует объявить screenSize Конфигурация, потому что она также изменяется, когда устройство переключается между книжной и альбомной ориентацией.

Итак, манифест должен выглядеть следующим образом (если вы хотите самостоятельно обрабатывать изменения ориентации):

****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
}
Другие вопросы по тегам