Contexte Android AsyncTask Terminated
-
25-09-2019 - |
Question
Lorsqu'une activité se termine, par exemple, après le changement d'orientation de l'écran, est-ce possible de changer un contexte d'activité AsyncTask
? Sinon, il va créer une erreur, car lorsque l'activité se termine le contexte de l'activité de AsyncTask
est parti aussi.
Mes devoirs fait est le suivant:
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
La solution
Qu'est-ce que vous passez sur votre onRetainNonConfigurationInstance()
? Ce que je fais est de passer d'un objet à elle contenant le AsyncTask
, et je tente de récupérer la valeur getLastNonConfigurationInstance()
.
EDIT: En y repensant, cela dépend de ce que vous voulez faire après un changement de configuration. Si vous voulez mettre fin à la AsyncTask
, puis appelez cancel()
sur elle. Si vous souhaitez poursuivre son traitement, même après un changement d'orientation, alors vous devez tenir à la tâche.
Vous pouvez le faire en sauvant l'Activity
dans le AsyncTask
comme ceci:
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;
}
}
Autres conseils
dans la méthode OnCancel de votre tâche asynch mettre fin ();
public void onCancel(DialogInterface dialog) {
cancel(true);
dialog.dismiss();
finish();
}