Frage

Wenn eine Aktivität endet, z. B. nach der Änderung der Bildschirmausrichtung, ist dies möglich, um eine zu ändern AsyncTask Aktivitätskontext? Andernfalls erzeugt es einen Fehler, denn wenn die Aktivität endet AsyncTaskDer Aktivitätskontext ist auch weg.

Meine Hausaufgaben sind Folgendes:

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
War es hilfreich?

Lösung

Was geben Sie Ihre weiter onRetainNonConfigurationInstance()? Was ich tue, ist ein Objekt, das das enthält AsyncTask, und dann versuche ich, den Wert in abzurufen getLastNonConfigurationInstance().

Bearbeiten: Nach dem zweiten Gedanken hängt es davon ab, was Sie nach einer Konfigurationsänderung tun möchten. Wenn Sie das beenden möchten AsyncTask, und dann rufen Sie an cancel() darauf. Wenn Sie seine Verarbeitung auch nach einer Änderung der Orientierung fortsetzen möchten, müssen Sie sich an der Aufgabe festhalten.

Sie können das tun, indem Sie die speichern Activity in dem AsyncTask so was:

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;
 }
}

Andere Tipps

in der Oncancel -Methode Ihrer asynchischen Aufgabe Put enden ();

        public void onCancel(DialogInterface dialog) {
        cancel(true);
        dialog.dismiss();
        finish();
    }
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top