UI线程如何等待直到后台线程完成处理?

时间:2016-07-02 13:36:45

标签: java android multithreading

我在主线程中有这段代码:

//在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找到了一个答案,但它对我不起作用..

3 个答案:

答案 0 :(得分:1)

2分 - 您实际上并没有执行异步任务 - 您使用

创建它
AsyncTas o = new AsyncTas();

但你需要调用

o.execute();

下一个问题是Toast会立即尝试访问任务创建的数据。你需要搬家

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

这意味着Toast只会在数据准备就绪后执行并在UI线程中执行。

答案 1 :(得分: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();

希望它会有所帮助。

答案 2 :(得分:0)

[XmlRoot("webParts")]
public class webParts : List<webPart>
{
    static public webParts FromXml(string path)
    {
        webParts returnValue = null;
        var serializer = new XmlSerializer(typeof(webParts));
        using (var stream = File.OpenRead(path))
        {
            returnValue = (webParts)serializer.Deserialize(stream);
        }
        return returnValue;
    }
}

public class webPart
{
    public string title { get; set; }
}