作者givemepass (λ)
看板AndroidDev
标题Re: [问题] 请问执行绪
时间Wed Apr 13 20:55:37 2016
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
你可以试着先实作看看
如果有疑问 可以考虑把你的程式码贴出来给大家看看
这边高手很多 应该可以帮你解决不少问题
--
posted from android bbs reader on my Nokia 3310
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 114.24.49.141
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/AndroidDev/M.1460552147.A.B71.html
1F:推 kewang: 这篇要mmmmmmmmmmmmmmmmm 04/13 23:58
2F:推 fightmz: 您好我有拜读过您在部落格的文章,这篇您又做了更完整的 04/14 01:44
3F:→ fightmz: 统整,我还没吸收完,先谢谢您,我的发问因为太急燥描述 04/14 01:44
4F:→ fightmz: 的太草率真抱歉 04/14 01:44
5F:推 fightmz: 连 asynctask都拼错(请多见谅QQ 04/14 01:46
6F:推 fightmz: 我会先再尝试写写看并修正我要的东西,毕竟是公司的专案 04/14 01:49
7F:→ fightmz: 不方便公开,如果有问题我会再整理好把问题和 code 放上 04/14 01:49
8F:→ fightmz: ,谢谢 04/14 01:49
9F:推 andy2151: 受益良多 感谢大大分享 04/14 09:16
10F:推 aiweisen: 推这篇 04/14 13:15
11F:→ firewolf: 如果用HandlerThread程式结束记得呼叫 quit(),否则会有 04/14 13:32
12F:→ firewolf: 一个 Thread在背景一直是在 running状态,不会被GC回收 04/14 13:33
13F:推 lovelycateye: Rick 神! 04/14 19:56
14F:推 tn00364477: rick 神! 已跪 04/15 09:19
15F:→ givemepass: 楼上两位神 别这样... 04/15 15:03
16F:推 da135ha: 太棒惹~~~ 04/17 21:02
17F:→ kobe8112: 好神! 04/19 11:33
18F:推 yuzhichen: 感谢大大分享,观念太重要! 04/20 17:12