我有一个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变量完成?
谢谢。
答案 0 :(得分:1)
问题可能源于使用已经异步返回响应的库,因此您的AsyncTask
没有阻塞。查看库文档。
AsyncTask
与普通线程不同。它专门执行一次,如果需要,在doInBackground
方法中阻塞,然后返回要在主线程中处理的结果。如果您的第三方REST库具有其调用的同步版本,则可以在AsyncTask
中使用它,但是它的效率可能不如该库的内置功能。</ p>