2016-07-02 73 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; 
     } 
    } 
}