作者abcb1 (一票難求!)
看板AndroidDev
標題Re: [問題] Looper.loop() 可以改成 non block嗎
時間Wed Aug 23 09:33:48 2017
※ 引述《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://webptt.com/m.aspx?n=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://webptt.com/m.aspx?n=bbs/AndroidDev/M.1503452032.A.D46.html
1F:→ ssccg: 你的想法有問題,while寫成那樣就是說一定要接到一個msg才 08/23 09:52
2F:→ ssccg: 輪到監聽,一定要監聽資料才處理下一個msg 08/23 09:53
3F:→ ssccg: 如果要用message處理機制達成non-blocking,本來就該用另一 08/23 09:56
4F:→ ssccg: 個thread監聽再發message,不然監聽這件事就會block thread 08/23 09:56
5F:→ kobe8112: 我會建議初學可以去翻些實體書,對Android的各種同步、 08/23 10:02
6F:→ kobe8112: 消息傳遞機制有大略的了解,再去依據需求到板上或 08/23 10:03
7F:→ kobe8112: Stack Overflow、CSDN等地方搜尋更深入的做法、討論, 08/23 10:04
8F:→ kobe8112: 一般剛接觸的朋友應該不會管到Looper去才對啊QQ 08/23 10:04
9F:→ ssccg: 如果監聽是用non-blocking的API,那更單純直接用Handler定 08/23 10:05
10F:→ ssccg: 期檢查有沒有新收到資料就好 08/23 10:05
11F:→ ssccg: 如果你真的就是要一送一收,block住等結果那就把送收都寫在 08/23 10:07
12F:→ ssccg: 同個handleMessage就好 08/23 10:08
13F:→ ssccg: 總之都不會需要動到Looper,Looper+MessageQueue就是用來讓 08/23 10:12
14F:→ ssccg: 在thread上做事變成event-driven/non-blocking,你要破壞這 08/23 10:22
15F:→ ssccg: 實作卻說目標是要達成non-blocking讓人無法理解... 08/23 10:22