2016-07-02 6 views
0

Ich habe diesen Code in Main Thread:Wie kann UI-Thread warten, bis Hintergrund-Thread die Verarbeitung beendet?

// in MyAsyncTask doinBackground und OnPostExecute Füllen Sie meinen second mit Artikel

public class MainActivity extends Activity { 

    ArrayList<String> secondArray = new ArrayList<String>(); 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     final ListView lv= (ListView) findViewById(R.id.listView); 
     final ListView lv2= (ListView) findViewById(R.id.listView2); 
      AsyncTas o = new AsyncTas(); 

     Toast.makeText(MainActivity.this, secondArray.get(0), Toast.LENGTH_LONG).show(); 

    } 

    private class AsyncTas extends AsyncTask { 
ArrayList<String> firstArray = new ArrayList<String>(); 
     @Override 
     protected ArrayList<String> doInBackground(Object[] params) { 
      firstArray.add("item1"); 
      firstArray.add("item2"); 
      firstArray.add("item3"); 
      try { 
       Thread.sleep(1200); 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 
      return firstArray; 

     } 
     @Override 
     protected void onPostExecute(ArrayList<String> o) { 
      secondArray.clear(); 
      secondArray.addAll(o); 

     } 
    } 
} 

Aber ich habe einen von java.lang.IndexOutOfBoundsException verursacht Fehler: ungültige Index 0, Größe ist 0

Meine Frage ist, wie man auflegt oder Hauptfaden warten lässt, bis Hintergrund seine alle Verarbeitung beendet und danke?

fand ich eine Antwort in Waiting till the async task finish its work aber nicht mit mir .. arbeitet aysnctask zuerst, dann in seinen OnPostExecute hinzufügen alle Reaktion in Array dann diese array.get findet (0)

+0

Was ist der Grund für einen Hintergrund-Thread, wenn Sie den Haupt-Thread halten, bis die Verarbeitung im Hintergrund-Thread abgeschlossen ist? – Chebyr

+0

@Chebyr Da ich auf einige Verbindungen warten und einige Stücke von Daten dann es wird in einer anderen AsyncTask – Ahmed

Antwort

1

2 Punkte - Sie ausführen nicht wirklich Ihre async Aufgabe - Sie können es

AsyncTas o = new AsyncTas(); 

mit

erstellen, aber Sie müssen dann

o.execute(); 

Das nächste Problem, dass der Toast wird sofort anrufen versucht, Greifen Sie auf die Daten zu, die von der Aufgabe erstellt werden. Sie müssen

Toast.makeText(MainActivity.this, secondArray.get(0), Toast.LENGTH_LONG).show(); 

... zum OnPostExecute() -Methode der Aufgabe bewegen:

@Override 
     protected void onPostExecute(ArrayList<String> o) { 
      secondArray.clear(); 
      secondArray.addAll(o); 
      Toast.makeText(MainActivity.this, secondArray.get(0), Toast.LENGTH_LONG).show(); 
     } 

Das bedeutet, dass der Toast wird nur dann ausgeführt, wenn die Daten bereit sind, und führen Sie in dem UI-Thread.

+0

Danke Ramasay, aber ich möchte diesen Teil nicht in der onPostExecte-Methode ausführen, die ich im Hauptthread ausführen möchte. – Ahmed

+0

Nun, ich denke, du meinst, du möchtest, dass der Toast im UI-Thread ausgeführt wird, der derselbe Thread ist, der die Aktivität erstellt und onCreate() aufruft. Glücklicherweise wird die onPostExecute() -Methode im UI-Thread ausgeführt, also wurde die Mission ausgeführt! –

0

Bitte führen. Ihr Array ist immer noch leer, aber Sie versuchen, Wert auf null Position zu erhalten.

new AsyncTas().execute(); 

dann in OnPostExecute() -

secondArray.clear(); 
secondArray.addAll(o); 
Toast.makeText(MainActivity.this, secondArray.get(0), Toast.LENGTH_LONG).show(); 

Hoffe, es hilft.

+0

Vielen Dank Vikram verarbeitet werden, ist mein Problem, dass ich viele Hintergrund-Threads habe, aber ich möchte diesen Code im Haupt-Thread ausführen, wie ich mach das. – Ahmed

+0

dies wird nur im Haupt-Thread. onPostExecute() wird im Hauptthread aufgerufen. –

0
import android.app.Activity; 
import android.os.AsyncTask; 
import android.os.Bundle; 
import android.widget.ListView; 
import android.widget.Toast; 

import java.util.ArrayList; 

public class MainActivity extends Activity { 

    private ArrayList<String> secondArray; 
    private ListView lv, lv2; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     lv = (ListView) findViewById(R.id.listView); 
     lv2 = (ListView) findViewById(R.id.listView2); 

     new Task().execute(); 
     Toast.makeText(MainActivity.this, secondArray.get(0), Toast.LENGTH_LONG).show(); 

    } 

    class Task extends AsyncTask<Void, Void, ArrayList<String>> { 

     @Override 
     protected ArrayList<String> doInBackground(Void... params) { 
      ArrayList<String> firstArray = new ArrayList<String>(); 
      firstArray.add("item1"); 
      firstArray.add("item2"); 
      firstArray.add("item3"); 
      return firstArray; 
     } 

     @Override 
     protected void onPostExecute(ArrayList<String> strings) { 
      super.onPostExecute(strings); 
      secondArray = strings; 
     } 
    } 
} 
Verwandte Themen