android - 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 变量完成?
谢谢你。
解决方案
问题可能源于使用已经异步返回响应的库,因此您AsyncTask
没有阻塞。检查库文档。
AsyncTask
不像普通的线程。专门执行一次,必要时在doInBackground
方法中阻塞,然后返回结果在主线程中处理。如果您的 3rd 方 REST 库具有其调用的同步版本,您可以在您AsyncTask
的 .
推荐阅读
- c - 在 C 语言中,验证参数和处理错误的一些最常见的选项是什么?
- python - 替换字符串数据框 pandas 中的第一个值
- django-rest-framework - DRF 创建自定义权限类作为抽象类
- mysql - SQL 查询 NOT EXISTS intesad of NOT IN
- typo3 - TYPO3 Bootstrap 包:图片更小/添加图片布局
- assembly - STM32 重置问题
- python - 使用 tweepy 访问与推文关联的用户 ID
- python - 我有一个 CMake 文件,我想在 python 中执行它
- python - Sizer.Remove():参数不匹配任何重载调用
- enums - Laravel 5.8 Unknow database type enum requested, Doctrine\DBAL\Platforms\MariaDb1027Platform 可能不支持