Re: [問題] 請問執行緒

看板AndroidDev作者 (漫無目的)時間8年前 (2016/04/14 09:25), 編輯推噓1(1023)
留言24則, 7人參與, 最新討論串3/3 (看更多)
※ 引述《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反而才像是殺雞 用牛刀的感覺,不過主管很堅持要這樣寫,我經驗不足暫時還無法體會這樣寫的意義在哪 ? -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 36.229.142.28 ※ 文章網址: https://www.ptt.cc/bbs/AndroidDev/M.1460597101.A.AA6.html

04/14 10:20, , 1F
我回文有說如果需要progress回報 用asynctask是蠻恰當
04/14 10:20, 1F

04/14 10:20, , 2F
的喔:)
04/14 10:20, 2F

04/14 10:23, , 3F
畫面會塞住可能你佔用到ui thread這部份需要看你的cod
04/14 10:23, 3F

04/14 10:23, , 4F
e是怎麼寫的才比較可能抓到問題
04/14 10:23, 4F

04/14 12:52, , 5F
殺雞用牛刀?不會吧 futuretask蠻正常的啊
04/14 12:52, 5F

04/15 00:59, , 6F
Debug就是下log 如果你專案太大沒辦法快速整理問題點 就是在
04/15 00:59, 6F

04/15 01:00, , 7F
可能的地方插log 像你這個畫面會hang住 就要在會access到UI的
04/15 01:00, 7F

04/15 01:01, , 8F
地方下個log看他是不是跑了很多很多很多次 然後再推敲問題點
04/15 01:01, 8F

04/16 00:54, , 9F
Update UI的話Async比較方便,內建callback不用自理
04/16 00:54, 9F

04/16 00:55, , 10F
射後不理的話推薦IntentService
04/16 00:55, 10F

04/16 01:32, , 11F
futuretask很正常我沒說他不正常阿 xd只是我現在的功能
04/16 01:32, 11F

04/16 01:32, , 12F
需求 用 他就必需寫 runOnUiThread而且一次還寫了五個,
04/16 01:32, 12F

04/16 01:32, , 13F
我是覺得看起來不是很舒服哈
04/16 01:32, 13F

04/16 01:54, , 14F
謝謝版上大大的解說,我找到原因了,因為我用 thread.run
04/16 01:54, 14F

04/16 01:54, , 15F
去執行 futuretask,這樣等於thread沒執行,還是在主線程
04/16 01:54, 15F

04/16 01:54, , 16F
做事,難怪ui會黑屏囧,不過很好奇主線程阻塞超過五秒不
04/16 01:54, 16F

04/16 01:54, , 17F
是應該會跳出 ANR?可是我沒跳出...
04/16 01:54, 17F

04/19 00:13, , 18F
有興趣可以看asynctask的原始碼呀…
04/19 00:13, 18F

04/19 08:52, , 19F
asynctask的原始碼我看過了,現在是主管不同意使用,即
04/19 08:52, 19F

04/19 08:52, , 20F
使我認為現在需求最適合用這個寫,我也只能把它拆掉
04/19 08:52, 20F

04/19 10:46, , 21F
futuretask比較適合只要一個結果的,中間還要跑進度條的話
04/19 10:46, 21F

04/19 10:48, , 22F
寫起來還是長得差不多...
04/19 10:48, 22F

04/19 10:51, , 23F
看起來只是原po主管自己追code習慣有問題,不想看asynctask
04/19 10:51, 23F

04/19 10:51, , 24F
的文件和原始碼就用執行順序不好懂直接否決
04/19 10:51, 24F
文章代碼(AID): #1N3l5jgc (AndroidDev)
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 3 之 3 篇):
文章代碼(AID): #1N3l5jgc (AndroidDev)