0

Wenn eine Aktivität beendet wird, z. Ist es nach Änderung der Bildschirmausrichtung möglich, einen Aktivitätskontext AsyncTask zu ändern? Sonst wird es einen Fehler verursachen, denn wenn die Aktivität beendet wird, ist auch der Aktivitätskontext von AsyncTask verschwunden.Android AsyncTask-Kontext beendet

getan Meine Hausaufgaben ist die folgende:

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 

Antwort

0

Was geben Sie an Ihre onRetainNonConfigurationInstance() weiter? Ich übergebe ein Objekt mit der AsyncTask, und dann versuche ich, den Wert in getLastNonConfigurationInstance() abzurufen.

EDIT: Zweitens, es hängt davon ab, was Sie nach einer Änderung der Konfiguration tun möchten. Wenn Sie die AsyncTask beenden möchten, und rufen Sie dann cancel() darauf. Wenn Sie die Bearbeitung auch nach einer Orientierungsänderung fortführen möchten, müssen Sie an der Aufgabe festhalten.

können Sie tun, indem Sie die Activity im AsyncTask wie diese zu speichern:

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

im OnCancel Methode Ihrer asynch Aufgabe gestellt finish();

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