Contexto de Android AsyncTask terminó
-
25-09-2019 - |
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 AsyncTask
El 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
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();
}