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