Re: [问题] 请问执行绪

楼主: givemepass (λ)   2016-04-13 20:55:37
http://slides.com/givemepass/android#/49
http://www.slideshare.net/rickwu12/ss-54297655
可以参考一下我写的投影片,
也可以去买一本书 高效能执行绪 欧莱礼出版的
http://www.books.com.tw/products/0010675871
AsyncTask只是帮你封装好跟UI Thread进行沟通,
但是更多情况是会被误用的,
主要原因是AsyncTask共同维护一个Thread Pool,
当你很多个Task在执行超过核心数的Thread,
你剩下的Task就会面临排队的下场,
因此再使用AsyncTask的时候, 最好是自定义Thread Pool,
另外有可能其实你只是需要背景处理任务,
又不需要progress回报,
这时候使用AsyncTask有一种杀鸡用牛刀的感觉,
Thread(不推荐使用)、HandlerThread或者Executors.newSingleThreadExecutor()
会是比较好的选择,
如果你需要任务排队且不想并行处理, 那么可以使用HandlerThread
如果你需要并行处理, 那么可以使用newCachedThreadPool、newFixedThreadPool
以上搭配Handler(getMainLooper()).post就可以达到UI更新画面
Future Pattern是一种领号码牌的机制,
他会让你任务送出去以后, 去做自己的事情,
等到任务处理完成再来处理画面更新,
Android很方便的把它跟ExecutorService绑在一起了,
让你可以轻松操作Executors,
例如
InvokeAll: 同时并行多个Thread, 并且透过blocking来取回每一个Task的结果。
InvokeAny: 同时并行多个Thread, 只要有一个回传成功, 则终止剩下的Task。
甚至可以使用ExecutorCompletionService
来控制每一个Task回传的结果。
透过这些高阶Thread机制的操作, 可以避免new太多Thread,
无法透过Thread来进行一些进阶的操作或者写出Callback Hell这种可怕的东西
生命周期受到控管...等等的好处
基本上我认为工具是先熟悉它再来择情况选择要使用哪种工具
才能达到这个工具的最大效益。
接着回答你的问题
: 写了安卓半年多了,http请求下载一直都是使用Asyntask,
: 最近主管突然要来 code refactor,他说 Asyntask不容易读(每个 method 传值从哪来
?
: 不懂)执意要用 FutureTask,网络上的范例根本找不到有跟 ui 互动的 futuretask啊?
?
: 用futuretask下载档案然后 broadcasts call view根本画面很塞(都黑屏了)考虑用
hand
: er做了,可是这样跟 asyntask做法跟本一样,而且官方还封装的更好,
: 请问版上的大大可以指导一下吗?
: 真的可以用 futuretask做出良好的 http请求吗?谢谢!!
可以。
跟你在操控AsyncTask差不多
把网络串接的部分写在background
等到任务回来再去通知UI更新画面
至于怎么写可以参考看看我写的范例
http://givemepass.blogspot.tw/2015/11/executorcompletionservice.html
http://givemepass.blogspot.tw/2015/11/future-pattern-2.html
另外可以参考这段影片 是koji大在JCConf演讲内容
刚看完的时候 收获超多
https://www.youtube.com/watch?v=_EqitUOUpes&feature=youtu.be&t=0
你可以试着先实作看看
如果有疑问 可以考虑把你的程式码贴出来给大家看看
这边高手很多 应该可以帮你解决不少问题
作者: kewang (652公共汽车)   2016-04-13 23:58:00
这篇要mmmmmmmmmmmmmmmmm
作者: fightmz (漫无目的)   2016-04-14 01:44:00
您好我有拜读过您在部落格的文章,这篇您又做了更完整的统整,我还没吸收完,先谢谢您,我的发问因为太急燥描述的太草率真抱歉连 asynctask都拼错(请多见谅QQ我会先再尝试写写看并修正我要的东西,毕竟是公司的专案不方便公开,如果有问题我会再整理好把问题和 code 放上,谢谢
作者: andy2151 (阿鸿)   2016-04-14 09:16:00
受益良多 感谢大大分享
作者: aiweisen (艾维森)   2016-04-14 13:15:00
推这篇
作者: firewolf (好心情)   2016-04-14 13:32:00
如果用HandlerThread程式结束记得呼叫 quit(),否则会有一个 Thread在背景一直是在 running状态,不会被GC回收
作者: lovelycateye (我还想要更多力量)   2016-04-14 19:56:00
Rick 神!
作者: tn00364477 (苍空枫铃)   2016-04-15 09:19:00
rick 神! 已跪
楼主: givemepass (λ)   2016-04-15 15:03:00
楼上两位神 别这样...
作者: da135ha (Steven)   2016-04-17 21:02:00
太棒惹~~~
作者: kobe8112 (小B)   2016-04-19 11:33:00
好神!
作者: yuzhichen (555)   2016-04-20 17:12:00
感谢大大分享,观念太重要!

Links booklink

Contact Us: admin [ a t ] ucptt.com