join()方法不等待线程结束

时间:2018-10-15 10:49:53

标签: android multithreading

我有一个AsyncTask,在其doInBackground方法中,我在另一个类中调用了一个方法:

@Override
protected ArrayList<CustomClass> doInBackground(ArrayList<CustomClass>...  array) {
    ArrayList<CustomClass> retorno= DataNetwork.GetCustomClassArrayList(array[0],(...more parameters...));
    return retorno;
}

在DataNetwork中,我具有该方法,该方法执行REST调用并返回结果。我被迫使用一个进行REST调用的库(我认为它使用Volley,但我不确定。要调用该库,我必须创建一个Intent,并将其传递给makeRESTCall方法):

public static ArrayList<CustomClass> GetCustomClassArrayList(various params goes here){
ArrayList<CustomClass> toReturn;
    //some parameters processing
    library.makeRESTCall(Intent intent){
        //processing the answer
        toReturn=processAnswerJSONResponse();
    }
return toReturn;
}

这样,在处理来自REST的答案之前,我先返回return toReturn行。因此,我尝试制作一个Thread,并使用join语句。现在,GetCustomClassArrayList方法(大部分,直到t.start()为止)都在线程内。该方法的结尾现在是:

(...)
 t.start();
    try {
        t.join();
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    return toReturn;

执行在t.start()之后立即调用t.join();并且toReturn为null。

也许这是一个菜鸟问题,但是使用join()方法始终对我有用,并在输入return语句之前等待线程完成。没有例外,没有错误。它只是不等待线程完成。

为什么现在不工作?在输入return语句之前,我该怎么做才能等待toReturn变量完成?

谢谢。

1 个答案:

答案 0 :(得分:1)

问题可能源于使用已经异步返回响应的库,因此您的AsyncTask没有阻塞。查看库文档。

AsyncTask与普通线程不同。它专门执行一次,如果需要,在doInBackground方法中阻塞,然后返回要在主线程中处理的结果。如果您的第三方REST库具有其调用的同步版本,则可以在AsyncTask中使用它,但是它的效率可能不如该库的内置功能。<​​/ p>