AsyncTask的个人小结
AsyncTask这个类大家用以前用的比较多,具体怎么用就不再去详细讲解了,谷歌前前后后修改过几次AsyncTask这个类,这几天在AsyncTask上算是 踩了回坑。
在做一个项目的时候,代码由分支合到主干的时候,有一个网络请求下载迟迟没有反应,打断点后,代码能正常执行。打了Log,每次发现最后打印的位置都不一样,甚是无奈,有考虑是不是混淆或者是代码哪里有问题,和分支代码一一对应比较,还是不能发现问题。
直到有几次发现,自己那个AsyncTask的子类doinbackgroud的方法根本没走,我才意识到会不会是AsyncTask的问题?查阅了有关资料,稍微总结下吧:
1.AsyncTask源码里private static final intMAXIMUM_POOL_SIZE=CPU_COUNT*2+1;
限制了线程的个数
【AsyncTask的个人小结】2.调用excute方法是以前的老方法,这里会有限制,按先后顺序每次只运行一个,也就是说它是按提交的次序运行,当别的线程迟迟没有响应,会导致线程阻塞,而恰巧我代码运行也是用的excute,并且现象就是阻塞。
果然,同事别的代码中也用到了AsyncTask,而且用的地方不只一处。上网查阅了有关方法,将代码的excute改为:
task.executeOnExecutor(Executors.newCachedThreadPool());
虽然很有效的解决了doinbackgroud没走的问题,但是还是会有阻塞的情况。
最终解决的方案,其实不令人如意,老大最终允许只有一处地方使用了AsyncTask,其余地方全部弃用,虽说结果不令人满意,但是还是学到了很多,如果大家项目中有很多地方用到AsyncTask,那就需要注意优化了。看看当时谷歌设计的AsyncTask,自己仿照源码抄了一遍,收益很大,也在找找有没有更好的异步类来替代他,如果大家有好的想法或者思路,欢迎指教。
推荐阅读
- 热闹中的孤独
- JAVA(抽象类与接口的区别&重载与重写&内存泄漏)
- 放屁有这三个特征的,请注意啦!这说明你的身体毒素太多
- 一个人的旅行,三亚
- 布丽吉特,人生绝对的赢家
- 慢慢的美丽
- 尽力
- 一个小故事,我的思考。
- 家乡的那条小河
- 《真与假的困惑》???|《真与假的困惑》??? ——致良知是一种伟大的力量