文章目录
  1. 1. 错误
  2. 2. 原因
  3. 3. 解决

错误

多个AsyncTaskLoader同时执行的时候,偶尔会闪退。 错误信息大致如下:

1
2
@@@ ABORTING: INVALID HEAP ADDRESS IN dlfree
Fatal signal 11 (SIGSEGV) at 0xdeadbaad (code=1)

原因

Stackoverflow上有一个类型的问题,但是它的原因是在多个线程中调用了BluetoothSocket#close方法。回到自己的问题上来,我这边发生的问题也极有可能在网络操作方法,而不是异步任务本身。由于我的项目使用了spring android来对远程API进行请求操作的,所以最终问题定位到RestTempalte上。起初怀疑是使用的网络模块的问题,spring android可以使用apache httpclientokhttp等作为http请求模块,但是逐一尝试还是解决不了问题。那问题只能出在RestTempalte本身了。Spring论坛上找到一个类似的问题,解决的办法是在RestTemplate初始化的代码上加上同步块,但是更为根本的原因还是不太清楚。

解决

我的项目是使用Roboguice来注入各种service供异步任务调用的,各个service对象注入的时候都会初始化RestTempalte。但是RestTempalte本身是线程安全的,所以所有的service使用同一个RestTempalte应该是没问题的。最终的修改就是service不再初始化RestTempalte,还是依赖注入一个容器中单例的RestTempalte

文章目录
  1. 1. 错误
  2. 2. 原因
  3. 3. 解决
Fork me on GitHub