2016-07-02 71 views
0

我有這樣的代碼在主線程:UI線程如何等待直到後臺線程完成處理?

//在MyAsyncTask doinBackground和onPostExecute填補了我secondArray與項目

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); 

     } 
    } 
} 

但我造成java.lang.IndexOutOfBoundsException一個錯誤:無效索引0,大小爲0

我的問題是如何掛斷或讓主線程等待直到背景結束其所有處理,並感謝您?

我找到了答案在Waiting till the async task finish its work,但它不是我工作..

+0

如果你要撐起主線程直到後臺線程處理完成,有後臺線程有什麼意義? – Chebyr

+0

@Chebyr因爲我正在等待一些連接,並獲得一些數據peaces然後它將在另一個AsyncTask處理 – Ahmed

回答

1

2分 - 你是不是真正執行你的異步任務 - 你

AsyncTas o = new AsyncTas(); 

創建它,但你需要再調用

o.execute(); 

接下來的問題是,吐司立即嘗試訪問由任務創建的數據將由創建。你需要移動

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

...到任務的onPostExecute()方法:

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

將意味着麪包將只執行一次數據已準備好,並在UI線程中執行。

+0

謝謝Ramasay,但我不想在onPostExecte方法中執行此部分,我想在主線程中執行它。 – Ahmed

+0

嗯,我認爲你的意思是你希望在UI線程中執行Toast,這是創建Activity並調用onCreate()的同一個線程。幸運的是,onPostExecute()方法在UI線程中運行,所以任務完成了! –

0

請執行aysnctask第一再在其onPostExecute添加在陣列中的所有響應,然後找到這個array.get(0)。你的數組仍然是空的,但你試圖在第零個位置獲得價值。

new AsyncTas().execute(); 

然後onPostExecute() -

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

希望這將有助於。

+0

謝謝Vikram,我的問題是,我有很多後臺線程,但我想在主線程中執行此代碼如何可以我這樣做。 – Ahmed

+0

這隻會在主線程中。 onPostExecute()在主線程上調用。 –

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; 
     } 
    } 
}