0

Lorsqu'une activité se termine, par ex. après le changement d'orientation de l'écran, est-il possible de changer un contexte d'activité AsyncTask? Sinon, cela créera une erreur car lorsque l'activité se termine, le contexte d'activité de AsyncTask est parti aussi.Contexte AsyncTask Android Terminé

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 

Répondre

0

Que passez-vous sur votre onRetainNonConfigurationInstance()? Ce que je fais est de lui passer un objet contenant le AsyncTask, puis j'essaie de récupérer la valeur dans getLastNonConfigurationInstance().

EDIT: À la réflexion, cela dépend de ce que vous voulez faire après un changement de configuration. Si vous souhaitez mettre fin au AsyncTask, appelez le cancel() dessus. Si vous voulez continuer son traitement même après un changement d'orientation, alors vous devez vous accrocher à 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; 
} 
} 
0

dans la méthode OnCancel de votre tâche asynch mettre fin();

 public void onCancel(DialogInterface dialog) { 
     cancel(true); 
     dialog.dismiss(); 
     finish(); 
    }