Contesto Android AsyncTask terminato
-
25-09-2019 - |
Domanda
Quando un'attività termina, ad es.dopo aver cambiato l'orientamento dello schermo, è possibile cambiare un AsyncTask
contesto di attività?Altrimenti creerà un errore perché quando l'attività termina AsyncTask
Anche il contesto di attività di è scomparso.
I compiti che ho fatto sono i seguenti:
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
Soluzione
Cosa trasmetti al tuo onRetainNonConfigurationInstance()
?Quello che faccio è passargli un oggetto contenente il file AsyncTask
, e quindi provo a recuperare il valore in getLastNonConfigurationInstance()
.
MODIFICARE:Ripensandoci, dipenderebbe da cosa vuoi fare dopo una modifica della configurazione.Se vuoi terminare il AsyncTask
, e poi chiama cancel()
su di essa.Se vuoi continuarne l'elaborazione anche dopo un cambio di orientamento, devi mantenere il compito.
Puoi farlo salvando il file Activity
nel AsyncTask
come questo:
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;
}
}
Altri suggerimenti
Nel metodo Oncancel del tuo compito Asynch Put finish ();
public void onCancel(DialogInterface dialog) {
cancel(true);
dialog.dismiss();
finish();
}