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
Était-ce utile?

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();
    }
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top