Re: [問題] Looper.loop() 可以改成 non block嗎

看板AndroidDev作者 (一票難求!)時間7年前 (2017/08/23 09:33), 編輯推噓0(0015)
留言15則, 2人參與, 最新討論串2/2 (看更多)
※ 引述《abcb1 (一票難求!)》之銘言: : 標題: [問題] Looper.loop() 可以改成 non block嗎 : 時間: Tue Aug 22 10:35:35 2017 : : 請問各位前輩 : 我目前想做的功能是 我開一個 thread : 可以接收 main thread 來的message做處理(轉成自己的指令格式用socket傳給server) : 同時也要監聽server是否有回應 : : 現在的問題是 我用Looper來收 main thread message : 但loop()當messgae queue沒東西會卡住 : 我希望做到的是 在Message queue沒東西時還能做其他的事 (像下面的架構) : : : private class ClientThread implements Runnable { : : @Override : public void run() { : : while(true) { : ...... : ...... : looper.loop() // 正常會卡住 : : ............. // 我想做的事 : } : } : : } : : 請問有辦法讓 loop non block嗎 : 我目前想到的另一個做法是把我要做的事 寫成 IdleHanlder 綁定到 message queue : 讓 queue空的時候去做我指定的事 : : 但還是想請問各位 : 1. loop() 有辦法 nonblock嗎 : 2. 或者有什麼其他建議的做法 我想這個問題應該很多人會遇到 : (專門開一個 thread 只能做meesgae 處理好像有點?) : : 希望大家能多給些意見 先在此感謝各位的回答 : : -- : Everything is allright : Tomorrow"ll be fine : : -- : ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 61.216.178.86 : ※ 文章網址: https://www.ptt.cc/bbs/AndroidDev/M.1503369340.A.212.html : → ssccg: looper就用來處理message queue的,有事要做就發到message 08/22 12:51 : → ssccg: queue就好幹麻要動looper? 08/22 12:51 : → ssccg: 專門一個thread處理message有點什麼? 08/22 12:52 : → ssccg: 嫌thread太閒就多發點message不就好了 08/22 12:55 : 推 KeySabre: 原po完全誤解looper用途吧 08/22 21:19 : → y3k: 你用Handler就好了 08/22 22:53 抱歉 補充一下我的想法 我looper會接收 main thread來的 message 然後走socket發指令給 server端 但同時也要監聽有沒有server端回來的 resposne 如果response也要包成message的話 我就要多開一個 thread專門去做監聽的動作 然後再包成 message丟回來 (應該是這樣沒錯?) 但我想把兩個thread的事情合在一個 thread裡 while (true) { 1.接收並處理 UI thread 送來的 messagee // 2.監聽有無response } 不知道這樣有解釋到我想問能不能有 non-block looper的疑問了? y3k: 你用Handler就好了 不好意思 y3k大 我剛學 android沒多久 這個敘述太簡單了 我不太理解你的意思 我的確是有 handler 去處理 message 但我的 Idlehandler 是透過 MessageQueue addIdleHandler(MessageQueue.Idlehandler) 去讓 looper在 queue沒 message的時候 做我要做的事 感謝各位的回答 希望能跟各位再討論一下 -- Everything is allright Tomorrow"ll be fine -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 61.216.178.86 ※ 文章網址: https://www.ptt.cc/bbs/AndroidDev/M.1503452032.A.D46.html

08/23 09:52, , 1F
你的想法有問題,while寫成那樣就是說一定要接到一個msg才
08/23 09:52, 1F

08/23 09:53, , 2F
輪到監聽,一定要監聽資料才處理下一個msg
08/23 09:53, 2F

08/23 09:56, , 3F
如果要用message處理機制達成non-blocking,本來就該用另一
08/23 09:56, 3F

08/23 09:56, , 4F
個thread監聽再發message,不然監聽這件事就會block thread
08/23 09:56, 4F

08/23 10:02, , 5F
我會建議初學可以去翻些實體書,對Android的各種同步、
08/23 10:02, 5F

08/23 10:03, , 6F
消息傳遞機制有大略的了解,再去依據需求到板上或
08/23 10:03, 6F

08/23 10:04, , 7F
Stack Overflow、CSDN等地方搜尋更深入的做法、討論,
08/23 10:04, 7F

08/23 10:04, , 8F
一般剛接觸的朋友應該不會管到Looper去才對啊QQ
08/23 10:04, 8F

08/23 10:05, , 9F
如果監聽是用non-blocking的API,那更單純直接用Handler定
08/23 10:05, 9F

08/23 10:05, , 10F
期檢查有沒有新收到資料就好
08/23 10:05, 10F

08/23 10:07, , 11F
如果你真的就是要一送一收,block住等結果那就把送收都寫在
08/23 10:07, 11F

08/23 10:08, , 12F
同個handleMessage就好
08/23 10:08, 12F

08/23 10:12, , 13F
總之都不會需要動到Looper,Looper+MessageQueue就是用來讓
08/23 10:12, 13F

08/23 10:22, , 14F
在thread上做事變成event-driven/non-blocking,你要破壞這
08/23 10:22, 14F

08/23 10:22, , 15F
實作卻說目標是要達成non-blocking讓人無法理解...
08/23 10:22, 15F
文章代碼(AID): #1PdDk0r6 (AndroidDev)
文章代碼(AID): #1PdDk0r6 (AndroidDev)