2017-06-21 6 views
-1

Ich erhalte ein JSON - Objekt vom Server und ich möchte die UI eines Layouts davon aktualisieren (nimm einen Teil des JSons und aktualisiere einen Wert von diesem, zB; json hält {num: 1, book: 2 } Update auf UI-Buch: 1 zum Buch:?. 20Wie implementiert man AsyncTask in Android aus verschiedenen Layouts & Klassen?

Die doInBackground Aufgabe in einer separaten Klasse ist, wie kann ich die Ergebnisse aus diesem und geben sie nicht an meine UI-Klasse ziehen

Danke

Codebeispiele bevorzugt

+2

'AsyncTask' hat eine' onPostExecute' Methode, die auf einem UI-Thread ausgeführt wird. Sie können das verwenden – Ramanlfc

+2

Zeigen Sie Ihre Bemühungen –

+0

Erzählen Sie uns etwas über Ihren Code, ist AsyncTask in der gleichen Klasse? Einige weitere Informationen sind erforderlich. – Ashwani

Antwort

1

Wie Sie das nicht erwähnt haben Änderungen, die Sie in UI vornehmen möchten, gebe ich eine allgemeine Methode mit einem Beispiel der Aktualisierung textView von AsyncTask.

Es gibt eine Methode onPostExecute(), die Ihnen hier helfen kann. Sagen Sie bitte eine Instanz von Textview in UI haben, dann können Sie wie folgt vorgehen:

protected void onPostExecute(String result){ 
    textView.setText(result); 
} 

Und ja, wie Sie fordern, dass Ihre Ansichten in anderen Klasse sind und wie sie dann hier in AsyncTask Klasse zuzugreifen, ist die Lösung :

Pass Activity-Instanz beim Starten von AsyncTask. Jetzt können Sie alle Ansichten dieser Aktivität verwenden. Zum Beispiel:

class MyAsyncTask extends AsyncTask<URL, Integer, Long> { 

    Activity mActivity; 

    //constructor. 
    public MyAsyncTask(Activity activity) { 
     mActivity = ativity; 
    } 

    ... 

    protected void onPostExecute(String result){ 
     TextView tv = mActivity.findViewById(...); 
     tv.setText(result); 
    } 
} 

Und AsyncTask wie folgt beginnen:

new MyAsyncTask(MainActivity.this).execute(); 
+0

Vielen Dank, tolle Erklärung und Code-Schnipsel! sehr hilfreich –

0

Die AsyncTask hat eine OnPostExecute Methode genau für diesen Zweck. Betrachten Sie folgendes Beispiel:

public class ImportantTask extends AsyncTask<Void, Void, JSONObject> { 

    public JSONObject doInBackground(Void... params) { 
     // Do your stuff, this is a background thread 
     return someJsonObject; 
    } 

    public void onPostExecute(JSONObject... params) { 
     JSONObject json = params[0]; 
     // Pass those values to your views, this is a UI thread 
    } 

} 
+0

Was ist der Unterschied zwischen onPostExecute und onProgressUpdate? Danke –

+0

onProgressUpdate ist nur für kleine Updates, während die Aufgabe noch läuft, zum Beispiel zeigen einen Ladeprozentsatz (10% ... 20% ...) während onPostExecute ist, wenn Sie komplett fertig sind – Aenadon

+0

onPregressUpdate ist für die Aktualisierung einer Benutzeroberfläche beim Ausführen der Aufgabe im Hintergrund @ C.SMITH – Kaushal28

0

Diese Zuerst helfen kann, kann man eine Bohne des Objekts

public class MyData{ 
int num; 
int books; 
//Add getters and setters, i am leaving it for you 
} 

Machen Sie eine Schnittstelle

public interface MyInterface{ 
public void onTaskComplete(MyData myData);//make use of your bean 
} 

Ihre AsyncTask Klasse

public class MyAsyncTask extends AsyncTask<Void, Void, String>{ 
MyInterface myInterface; 
public MyAsyncTask(.../*your parameters*/,MyInterface myInterface){ 
this.myInterface = myInterface; 
} 
... 
@Override 
protected String doInBackground(Void... params) { 
return jsonString; 
} 

@Override 
protected void onPostExecute(String jsonString) { 
//parse your data 
MyData myData = parse(jsonString); 
myInterface.onTaskComplete(myData); 
} 

public MyData parse(String jsonString){ 
//your parsing login 
} 

} 

Ihre Aktivität

public class MainActivity extends AppCompatActivity implements MyInterface{ 
//your code logic 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
... 
//when you are calling your asyncTask 
MyAsyncTask myAsyncTask = new MyAsyncTask(/*your existing parameters*/, MainActivity.this);//pass the context of activity; 
myAsyncTask.execute(); 
//after execution your onTaskComplete method will be called. 
} 

@Override 
public void onTaskComplete(MyData myData){ 
//your task has completed 
//update your UI here 
} 
0

Wie pro Ihre Anforderung, können Sie Schnittstelle für diesen Zweck verwenden. Konstruieren Sie einfach eine Schnittstelle mit einer Methode, die String als Argument verwendet, verwenden Sie diese Schnittstelle als ein Feld in Ihrer AsyncTask-Klasse und rufen Sie die Methode onPostExecute() über das definierte Feld auf. Lassen Sie Ihre Aktivitäten diese Schnittstelle überwachen, indem Sie auf dieses Feld zugreifen und überschreiben Sie dann die nicht implementierte Methode der Schnittstelle, um die Zeichenfolge von der Methode onPostExecute() zu erhalten.

Verwandte Themen