2016-03-23 13 views
0
ausführen

Ich habe eine Klasse, die AsyncTaskAndroid AsyncTask Ergebnis erhalten nach finsih

public class MyClass extends AsyncTask<Void, Void, Void> { 
    private String response; 

    public String getResponse(){ 
     return response; 
    } 

    @Override 
    protected Void doInBackground(Void... arg0) { 
     /* code */ 
     return null; 
    } 
    @Override 
    protected void onPostExecute(Void result) { 
     response = aString; 
     super.onPostExecute(result); 
    } 
} 

In anderen Tätigkeit erstreckt, erstelle ich eine Instanz von MyClass

MyClass c = new MyClass(); 
c.execute(); 
response = c.getResponse(); 
Toast.makeText(getApplicationContext(), "response = " + response, Toast.LENGTH_LONG).show(); 

Jedoch habe ich auf die Antwortvariable null bekam, vielleicht, weil der Toast vor dem Ende der Aufgabe ausgeführt wurde. Kannst du mir den richtigen Weg geben, damit ich nach der Aufgabe das Ergebnis erhalten kann?

+0

Anruf Toast von AsyncTask. – Wukash

+0

Kann man den Logcat posten? – Raghavendra

+0

Ich brauche das Ergebnis für die Aktivität, die die Instanz erstellen – ZZZ

Antwort

2

Sie benötigen kein Klassenfeld für das Ergebnis. Die AsyncTask<Params, Progress, Result> liefert alles, was Sie brauchen.

Sie möchten also ein String zurück von der Aufgabe haben. Um dies zu erreichen, müssen Sie die Result in String ändern. Im Grunde wie folgt aus:

public class MyClass extends AsyncTask<Void, Void, String> { 

    @Override 
    protected String doInBackground(Void... arg0) { 
     /* do background stuff to get the String */ 
     return string; // the one you got from somewhere 
    } 
} 

Sie müssen auch für die Berechnung warten durch die Methode get() aufrufen.

String response = new MyClass().execute().get(); 
Toast.makeText(getApplicationContext(), "response = " + response, Toast.LENGTH_LONG).show(); 

Lesen Sie mehr über AsyncTask#get here

+0

Ich denke nicht, dass das funktioniert. Die Methode 'doInBackground' läuft im Hintergrundthread, aber 'get()' wird im UI-Thread ausgeführt, so dass beide Prozesse parallel ablaufen und dies nicht garantiert, dass wir die richtige Zeichenfolge von den Prozessen im Hintergrund erhalten können –

1

AsyncTask wird asynchron in einem separaten Thread ausgeführt. Das heißt, wenn Sie response = c.getResponse(); aufrufen, ist die Task weiterhin mit der Ausführung beschäftigt. Sie können entweder das Ergebnis in onPostExecute behandeln oder mithilfe eines BroadcastReceiver oder EventBus Ihre Aktivität darüber informieren, dass die Aufgabe abgeschlossen wurde.

0

wie ein Konstruktor in MyClass mit Kontext der Tätigkeit als Argument machen unter

Context context; 

public MyClass(Context context){ 
    this.context = context; 
} 

// make toast in onPostExecute 
@Override 
protected void onPostExecute(Void result) { 
     super.onPostExecute(result); 
     Toast.makeText(context, "response = " + result, Toast.LENGTH_LONG).show(); 
} 

in einer anderen Aktivität Aufruf AsyncTask wie unten

MyClass c = new MyClass(YourActivity.this); 
c.execute(); 
Verwandte Themen