2012-06-25 14 views
15

Ich habe AsyncTasks mit meiner Anwendung verwendet, um die Benutzeroberfläche zu downloaden und zu aktualisieren.Android AsyncTasks Überprüfen, ob die Aktivität noch läuft

Vorerst meine AsyncTasks aktualisiert die UI echten einfach:

protected void onProgressUpdate(String... values) { 
     super.onProgressUpdate(values); 
     gender.setText(values[0]); 
} 

Mein Problem ist, wie man überprüfen, ob die Tätigkeit, die das Geschlecht TextView aus gemacht, noch verfügbar ist?

Wenn nicht, erhalte ich einen Fehler und meine Anwendung wird heruntergefahren.

+0

kann nicht sicher versuchen, mit if (null == Geschlecht && gender.isShown()) –

Antwort

25

Sie können Ihre AsyncTask in der onDestroy Aktivität abbrechen

@Override 
protected void onDestroy() { 
    asynctask.cancel(true); 
    super.onDestroy(); 
} 

und wenn Änderungen durchführen Sie überprüfen, ob Ihre AsyncTask abgebrochen wurde (Aktivität zerstört) oder nicht

protected void onProgressUpdate(String... values) { 
    super.onProgressUpdate(values); 
    if(!isCancelled()) { 
     gender.setText(values[0]); 
    } 
} 
+0

Schön. Aber es gibt keine Garantie, dass Ondestroy jedes Mal aufgerufen wird. (Für Referenzlink unten). Wie gehst du damit klar? https://Stackoverflow.com/a/4449988/3265444 – Ajji

0

Sollte nicht

if (gender) { 
    gender.setText(values[0]); 
} 

genug sein?

+0

nehmen Sie (null == Geschlecht)? auch dafür, nein, das ist nicht genug, irgendwann –

+1

Nein, das ist nicht genug. Die Aktivität ist möglicherweise beendet, aber das Geschlecht kann immer noch nicht null sein, und Versuche, darauf zu verweisen, schlagen fehl, weil die Ansicht/das Fenster nicht mehr aktiv ist. – AgileYogi

1

Obwohl ich dieses Szenario nie konfrontiert habe; Ich werde versuchen, deine Frage zu beantworten.

In Ihrem Fall müssen Sie die Context an AsyncTask übergeben validieren.

Sie Validierung durchführen können

if(null!=mContext) //Activity still exist!! 
{ 
    gender.setText(values[0]); 
} 
else //Activity is destroyed 
{ 
    //Take appropriate action!! 
} 

Der Vorteil sein wird, wenn die Aktivität durch die Zeit zerstört wird Sie diese Aussage erreichen, Ihr Context automatisch null werden, und Sie können das Szenario behandeln.

+2

Dies wird nicht funktionieren. Weil Sie hart auf die Aktivität verweisen, wird es nicht nulled. Es wird ungültig, aber die asynchrone Task behält weiterhin den Verweis auf die Aktivität bei. – uthark

1

will ich, dass Sie darauf bestehen, Wenn Sie Aktivität nicht ausführen, warum brechen Sie die AsyncTask nicht ab? Das wäre eine bessere und machbare Lösung. Wenn Ihre Anwendung läuft, sagen Sie, dass Sie von einer Aktivität zu einer anderen wechseln, dann gibt es keinen Fehler AFAIK.

Aber ich würde darauf bestehen, das AsyncTask dann you'r Aktivität abzubrechen läuft nicht, können Sie überprüfen, AsyncTask oder nicht läuft,

if(task != null && task.equals(AsyncTask.Status.RUNNING)) 
task.cancel(true); 
2

Versuchen

if (!isFinishing()) { 
    gender.setText(values[0]); 
} 
5

ich ein ähnliches hatte Problem - im Wesentlichen habe ich eine NPE in einer asynchronen Aufgabe bekommen, nachdem der Benutzer das Fragment zerstört hatte. Nachdem das Problem auf Stack-Überlauf Erforschung nahm ich die folgende Lösung:

volatile boolean running; 

public void onActivityCreated (Bundle savedInstanceState) { 

    super.onActivityCreated(savedInstanceState); 

    running=true; 
    ... 
    } 


public void onDestroy() { 
    super.onDestroy(); 

    running=false; 
    ... 
} 

Dann überprüfe ich „wenn läuft“ regelmäßig in meinem Asynchron-Code. Ich habe diesen Stress getestet und bin jetzt nicht in der Lage, meine Aktivitäten zu "brechen". Dies funktioniert perfekt und hat den Vorteil, einfacher zu sein als einige der Lösungen, die ich auf SO gesehen habe.

+0

DANKE SO VIEL !!! Ich habe es endlich geschafft zu arbeiten !!! – sshashank124

+1

Dies ist einfach und macht wirklich Sinn :) Wenn jemand über dieses 'flüchtige' Schlüsselwort nachdenkt, lesen Sie dies: http://Stackoverflow.com/a/107040/4331787 –

1

Als this Teil einer Ausbildung auf Android Developers vermuten läßt, hält ein WeakReference auf dem UI-Elemente, das aktualisiert werden muss, nachdem Aufgabe erledigt ist und prüfen, ob die Referenz null vor der Verwendung ist. Dies hilft nicht nur dabei, zu überprüfen, ob die Benutzeroberfläche noch vorhanden ist, sondern verhindert auch nicht, dass UI-Elemente als Garbage Collection erfasst werden.

1

Überprüfen Sie, ob Aktivität läuft oder nicht

if (!isFinishing()) { 
    // Do whatever you want to do 
} 
Verwandte Themen