2016-07-25 6 views
0

Wie kann man nichts tun oder nichts tun auf AsyncTask Ergebnis?

Mein Ziel ist einfach, geben Sie eine Adresse ein, klicken Sie auf eine Schaltfläche, um eine URL zu testen, wenn nicht das erwartete Ergebnis erhalten, eine Toast-Info und dann nichts tun. Wenn das Ergebnis erwartet wird, fahren Sie mit dem Programm fort.

Da ich URL in UIhread nicht verwenden kann, habe ich AsyncTask verwendet, das Problem ist: obwohl ich das Ergebnis von AsyncTak weiß, wie ich Aktivität zu tun oder nichts zu tun? Was ich will, ist eine Aussage in der OnClickListener wie folgt aus:

if (result is not expected) return; else continue do things. 

ich obige Aussage in OnPostExecute nicht schreiben kann, wird er zurückkehren OnPostExecute(), nicht OnClickListener().

Eine andere ist: auch wenn ich das Ergebnis an Aktivität weitergeben kann (nämlich an onClickLIstener()), wahrscheinlich, wenn das Ergebnis ankommt, führen UI-Thread bereits einige andere Codes, aber sie sollten nicht bevor Sie das Ergebnis wissen.

Kurz gesagt, ich brauche das URL-Ergebnis, um zu entscheiden, wie verbleibende Codes ausgeführt werden, daher kann async-Task nicht verwendet werden, was soll ich tun?

Danke.

Unten ist der Beispielcode:

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    btnConfirm.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 

     new XXX().execute(code); 
}); 

} 


class XXX extends AsyncTask<String, Void, String> { 
    protected String doInBackground(String... strArr) { 
     XXXXX; 
    } 

    protected void onPostExecute(String result) { 
     XXXXX; 
    } 
} 
+0

Nun Netzwerk-Aufgaben sollten asynchron sowieso durchgeführt werden, können Sie sicherstellen, dass nichts anderes auf der MainUI passiert, indem Sie eine Art unbestimmter Fortschrittsbalken verwenden. Setze es auf sichtbar, wenn du die asynctask startest und setze es dann auf unsichtbar 'onPostExecute() 'und mache den Rest der Dinge, die du tun musst. – wanpanman

+0

klingt gut, könnten Sie mir bitte mehr Details erzählen? Neben, was ist der normalste Weg für eine solche Aufgabe: Basis auf URL-Ergebnis zu tun oder nichts in Aktivität. ? – caibirdcnb

+0

Es hängt davon ab, was Sie tun. Wenn Sie etwas haben, das eine ständige Verbindung zu einem Server erfordert, würden Sie wahrscheinlich einen Thread verwenden, der kontinuierlich ausgeführt wird und dann die MainUI mit einem Handler kontaktiert. Wenn es etwas ist, das einmal ist, wie ein Knopf klicken und dann etwas passiert, dann ist die asynctask ein guter Weg zu gehen. Wenn Sie sich die Antwort von Eenvincible unten ansehen, rufen Sie einfach diese Funktion in 'onPostExecute()' auf und setzen Sie alles, was Sie in dieser Funktion tun müssen. Wenn Sie irgendeine Art von Ergebnis benötigen, dann fügen Sie der Funktion Argumente hinzu, z.'private void executeOnAsyncSuccess (String result)' – wanpanman

Antwort

1

Dies sollte einfach sein. Versuchen Sie diesen Ansatz:

Da Sie Ihre AsyncTask bereits als innere Klasse in Ihrer Aktivität haben, können Sie einfach ein Ergebnis in onPostExecute() zurückgeben und dann überprüfen, ob die Anfrage erfolgreich war oder nicht.

Nun, hier ist der letzte Teil: eine Methode in Ihrer Tätigkeit wie folgt erstellen:

private void executeOnAsyncSuccess(){ 
    //place the code here you want to run 
} 

Jetzt ist es innerhalb onPostExecute() leicht Sie anrufen können!

Sie können dies auch mit Events tun, aber dieser Ansatz sollte nur funktionieren!

Ich hoffe, das hilft!

+0

Entschuldigung, ich kann nicht folgen. Wollen Sie sagen, executeOnAsyncSuccess() innerhalb der onPostExecute() ausführen, wenn das Ergebnis erwartet wird? Aber das Ergebnis ist nur der Anfang, ich habe viele andere Methode, innere Klassen, setzen Sie alle in executeOnAsyncSuccess()? Ich bin nicht sicher. Was ich mehr mag, ist eine Möglichkeit, das Ergebnis in OnClickListener() statt onPostExecute() – caibirdcnb

+0

Wenn Sie in onPostExecute() sind, verwenden Sie eine if-Anweisung zu wissen, ob das Ergebnis erfolgreich ist und wenn ja, rufen Sie die executeOnAsyncSuccess-Methode - dann Sie innerhalb dieser Methode tun, was auch immer Sie getan haben würde in OnClickListener – Eenvincible

+0

ok, jetzt doInBackground() gibt an onPostExecute() wahr oder falsch, aber wie wäre es mit Variablen im UI-Thread (OnClickListener)? Zum Beispiel, String code = xxxx; im UI-Thread. Jetzt bin ich in onPostExecute(), wie man Code benutzt? – caibirdcnb

0

Ich habe gerade gelernt, dass vielleicht Callable ist eine gute Möglichkeit, verwenden Sie V get().