Pregunta

Cuando una actividad termina, por ejemplo, la orientación de la pantalla cambia, es posible cambiar un AsyncTask contexto de actividad? De lo contrario, creará un error porque cuando la actividad termina AsyncTaskEl contexto de actividad de la actividad también se ha ido.

Mi tarea hecha es la siguiente:

public void onSaveInstanceState(Bundle savedInstanceState) <- doesn't solve
public Object onRetainNonConfigurationInstance()  <- doesn't solve
android:configChanges="keyboardHidden|orientation" 
                     <- solved but doesn't handle well relative layouts
¿Fue útil?

Solución

¿Qué pasas con tu onRetainNonConfigurationInstance()? Lo que hago es pasar un objeto que contenga el AsyncTask, y luego trato de recuperar el valor en getLastNonConfigurationInstance().

EDITAR: Según un segundo pensamiento, dependería de lo que desee hacer después de un cambio de configuración. Si quieres terminar el AsyncTask, y luego llamar cancel() en eso. Si desea continuar su procesamiento incluso después de un cambio de orientación, debe aferrarse a la tarea.

Puedes hacer eso guardando el Activity en el AsyncTask como esto:

private MyAsyncTask searchTask;

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

 if (getLastNonConfigurationInstance()!=null) {
  SavedObject savedObj = (SavedObject)getLastNonConfigurationInstance();

  searchTask = savedObj.getAsyncTask();
  searchTask.attach(this);
 } else {
  searchTask = new MyAsyncTask(this);
  searchTask.execute();
 }
}

@Override
public Object onRetainNonConfigurationInstance(){

 searchTask.detach();

 final SavedObject savedObj = new SavedObject();
 savedObj.setAsyncTask(searchTask);

    return savedObj;
}


private class MyAsyncTask extends AsyncTask<Void, Void, Void> {

 MyActivity parentActivity = null;

    MyAsyncTask (MyActivity activity) {
  attach(activity);   
 }

 void attach(MyActivity activity) {
  this.parentActivity=activity;
 }

 void detach() {
  parentActivity=null;
 }

 // Do your thread processing here
}


private class SavedObject {
 private MyAsyncTask asyncTask;

 public void setAsyncTask(MyAsyncTask asyncTask){
  this.asyncTask = asyncTask;
 }

 public MyAsyncTask getAsyncTask() {
  return asyncTask;
 }
}

Otros consejos

in the OnCancel method of your asynch task put finish();

        public void onCancel(DialogInterface dialog) {
        cancel(true);
        dialog.dismiss();
        finish();
    }
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top