2017-05-14 1 views
0

Ich lade drei JSON-Objekte parallel über 3 drei parallel AsyncTask:Multiple AsyncTask - wie kann ich wissen, welches es in ‚OnPostExecute‘ ist

  dictAsync1Task = new DictAsyncTask(DictionaryLookUp.this, "Jishoo"); 
      dictAsync1Task.execute(); 

      dictAsync2Task = new DictAsyncTask(DictionaryLookUp.this, "Systran"); 
      dictAsync2Task.execute(); 

      dictAsync3Task = new DictAsyncTask(DictionaryLookUp.this, "Tatoeba"); 
      dictAsync3Task.execute(); 

Sobald eine Aufgabe erledigt, ich möchte aktualisieren eine ListView in meinem TabLayout (hey, wie bekomme ich diese coolen grauen Hintergrundrechtecke um die Befehle wenn ich eine Frage stelle?).

Gibt es eine Möglichkeit zu wissen, welche asyncTasks 'onPostExecute ich gerade bin? d. h., ich möchte die ListView über 'switch' aktualisieren, indem ich überprüfe, ob ich in onPostExecute von dictAsync1/2/3Task bin.

(Ich fand eine bessere Lösung, indem Sie einfach eine globalen Variablen innerhalb AsyncTask, aber ich bin immer noch neugierig, ob es eine Möglichkeit, dies ist der Weg I beschrieben)

+0

Sind alle mit demselben ListView verknüpft? – Mercato

+0

können Sie Token durch Abgrenzung zwischen Akzenten setzen (diese Zeichen: '') 'wie folgt ' – nandsito

+2

übergeben Sie eine Zeichenfolge im Konstruktor asynctask. Können Sie in onPostExecute darauf zugreifen? Sie können es verwenden, um zu wissen, welche asynctask ausgeführt wurde – nandsito

Antwort

0

Sie haben task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); für die parallele Ausführung zu verwenden, .

Wenn diese asynchronen Klassen statisch sind, müssen Sie Callback oder schwache Referenz (um Speicherlecks zu vermeiden) an Aktivität übergeben. Weiterleiten, dass Daten mit dem Typ onPostExecute heruntergeladen und dann nur relevante Tab-Liste aktualisiert.

Prototyp kann void refreshData(Object data,String type);

Sie sein können verschiedene Arten von Arraylist in Daten übergeben, da es Gegenstand ist. Sie können später wie dieser auf Typ

if(data != null && ((ArrayList<?>)data).size() > 0) 
    { 
     if(((ArrayList<?>)data).get(0) instanceof MyType) 
     { 
      // do stuff 
     } 
    } 

oder Schalter überprüfen und werfen dann data wie diese mTab1Data = ((ArrayList<MyType>)data)

und prüfen, ob Aktivität noch am Leben ist. Vielleicht verwenden Sie die Exit-App vor der asynchronen Beendigung.

+0

oh, ich wusste nicht, dass ich sie tatsächlich seriell ausführte, sieht aus wie sie das Verhalten geändert haben, danke für den Zeiger darauf. Ich bin mir nicht sicher, ob ich dem Rest folge, das ist ein bisschen zu weit fortgeschritten für mich Ich fürchte, versuchst du es zwischen "doInBackground" und "onPostExecute" zu geben oder wo würde dieser Code hin? – Mairyu

+0

können Sie das 'onPostExecute' übergeben. Wenn Sie in doInBackground benötigen, dann müssen Sie ui in runnable aktualisieren wie 'Activity.runOnUiThread (new Runnable() {})' – Qamar

Verwandte Themen