首页 > 解决方案 > join() 方法不等待线程结束

问题描述

我有一个 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 行。所以,我尝试创建一个线程,并使用 join 语句。GetCustomClassArrayList 方法(嗯,大部分,直到 t.start())现在在一个线程内。现在方法的结尾是:

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

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

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

为什么现在不工作了?在输入 return 语句之前,我可以做些什么来等待 toReturn 变量完成?

谢谢你。

标签: androidmultithreading

解决方案


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

AsyncTask不像普通的线程。专门执行一次,必要时在doInBackground方法中阻塞,然后返回结果在主线程中处理。如果您的 3rd 方 REST 库具有其调用的同步版本,您可以在您AsyncTask的 .


推荐阅读