Re: [问题] 请问执行绪

楼主: fightmz (漫无目的)   2016-04-14 09:24:58
※ 引述《givemepass (λ)》之铭言:
: 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
: 你可以试着先实作看看
: 如果有疑问 可以考虑把你的程式码贴出来给大家看看
: 这边高手很多 应该可以帮你解决不少问题
其实我的想法跟您相反,怕忘记我先写下来我的看法
1下载档案我只需要http请求一次,所以只需要开一个执行绪,下载期间,需要进度条显
示,我在网络上看需要进度条 ui 的大多是 asynctask 做,没看过用 futuretask
当然我尝试过在 futuretask的 callable 里面用 runOnUiThread 去跑进度条,结果是不
佳的,可能本身画面已经塞住,所以看不到效果?
另外是想问,画面塞住黑屏没动作,memory正常,没有 crash,
我大概猜是执行绪的问题 ,要知道详细哪里有问题要怎么去 debug? (android studio)
网络上搜中文关键字 黑屏 或是 塞住 只有看到一般手机使用者发问,我不晓得就开发者
的角度该怎么下这类正确的关键字?
2专案 ui 显示已经说下载期间不建议做其他事,就我认为用futuretask反而才像是杀鸡
用牛刀的感觉,不过主管很坚持要这样写,我经验不足暂时还无法体会这样写的意义在哪
作者: givemepass (λ)   2016-04-14 10:20:00
我回文有说如果需要progress回报 用asynctask是蛮恰当的喔:)画面会塞住可能你占用到ui thread这部份需要看你的code是怎么写的才比较可能抓到问题
作者: mshockwave (夏克维夫)   2016-04-14 12:52:00
杀鸡用牛刀?不会吧 futuretask蛮正常的啊
作者: y3k (激流を制するは静水)   2016-04-15 00:59:00
Debug就是下log 如果你专案太大没办法快速整理问题点 就是在可能的地方插log 像你这个画面会hang住 就要在会access到UI的地方下个log看他是不是跑了很多很多很多次 然后再推敲问题点
作者: cha122977 (CHA)   2016-04-16 00:54:00
Update UI的话Async比较方便,内建callback不用自理射后不理的话推荐IntentService
楼主: fightmz (漫无目的)   2016-04-16 01:32:00
futuretask很正常我没说他不正常阿 xd只是我现在的功能需求 用 他就必需写 runOnUiThread而且一次还写了五个,我是觉得看起来不是很舒服哈谢谢版上大大的解说,我找到原因了,因为我用 thread.run去执行 futuretask,这样等于thread没执行,还是在主线程做事,难怪ui会黑屏囧,不过很好奇主线程阻塞超过五秒不是应该会跳出 ANR?可是我没跳出...
作者: KeySabre (KeySabreur)   2016-04-19 00:13:00
有兴趣可以看asynctask的原始码呀…
楼主: fightmz (漫无目的)   2016-04-19 08:52:00
asynctask的原始码我看过了,现在是主管不同意使用,即使我认为现在需求最适合用这个写,我也只能把它拆掉
作者: ssccg (23)   2016-04-19 10:46:00
futuretask比较适合只要一个结果的,中间还要跑进度条的话写起来还是长得差不多...看起来只是原po主管自己追code习惯有问题,不想看asynctask的文件和原始码就用执行顺序不好懂直接否决

Links booklink

Contact Us: admin [ a t ] ucptt.com