AsyncTask这个类大家用以前用的比较多,具体怎么用就不再去详细讲解了,谷歌前前后后修改过几次AsyncTask这个类,这几天在AsyncTask上算是 踩了回坑。
在做一个项目的时候,代码由分支合到主干的时候,有一个网络请求下载迟迟没有反应,打断点后,代码能正常执行。打了Log,每次发现最后打印的位置都不一样,甚是无奈,有考虑是不是混淆或者是代码哪里有问题,和分支代码一一对应比较,还是不能发现问题。
直到有几次发现,自己那个AsyncTask的子类doinbackgroud的方法根本没走,我才意识到会不会是AsyncTask的问题?查阅了有关资料,稍微总结下吧:
1.AsyncTask源码里private static final intMAXIMUM_POOL_SIZE=CPU_COUNT*2+1;限制了线程的个数
2.调用excute方法是以前的老方法,这里会有限制,按先后顺序每次只运行一个,也就是说它是按提交的次序运行,当别的线程迟迟没有响应,会导致线程阻塞,而恰巧我代码运行也是用的excute,并且现象就是阻塞。
果然,同事别的代码中也用到了AsyncTask,而且用的地方不只一处。上网查阅了有关方法,将代码的excute改为:
task.executeOnExecutor(Executors.newCachedThreadPool());虽然很有效的解决了doinbackgroud没走的问题,但是还是会有阻塞的情况。
最终解决的方案,其实不令人如意,老大最终允许只有一处地方使用了AsyncTask,其余地方全部弃用,虽说结果不令人满意,但是还是学到了很多,如果大家项目中有很多地方用到AsyncTask,那就需要注意优化了。看看当时谷歌设计的AsyncTask,自己仿照源码抄了一遍,收益很大,也在找找有没有更好的异步类来替代他,如果大家有好的想法或者思路,欢迎指教。