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

作者: abcb1 (一票難求!)   2017-08-23 09:33:48
※ 引述《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 處理好像有點?)
:
: 希望大家能多給些意見 先在此感謝各位的回答
:
:
作者: ssccg (23)   2017-08-23 09:52:00
你的想法有問題,while寫成那樣就是說一定要接到一個msg才輪到監聽,一定要監聽資料才處理下一個msg如果要用message處理機制達成non-blocking,本來就該用另一個thread監聽再發message,不然監聽這件事就會block thread
作者: kobe8112 (小B)   2017-08-23 10:02:00
我會建議初學可以去翻些實體書,對Android的各種同步、消息傳遞機制有大略的了解,再去依據需求到板上或Stack Overflow、CSDN等地方搜尋更深入的做法、討論,一般剛接觸的朋友應該不會管到Looper去才對啊QQ
作者: ssccg (23)   2017-08-23 10:05:00
如果監聽是用non-blocking的API,那更單純直接用Handler定期檢查有沒有新收到資料就好如果你真的就是要一送一收,block住等結果那就把送收都寫在同個handleMessage就好總之都不會需要動到Looper,Looper+MessageQueue就是用來讓在thread上做事變成event-driven/non-blocking,你要破壞這實作卻說目標是要達成non-blocking讓人無法理解...

Links booklink

Contact Us: admin [ a t ] ucptt.com