看板 AndroidDev 關於我們 聯絡資訊
new Thread(new Runnable() { @Override public void run() { Looper.prepare(); Message msg = new Message(); msg.obj = new test("I am handle"); handle.sendMessage(msg); // Looper.loop(); Log.e("", "I am block test"); } }).start(); final Handler handle = new Handler() { @Override public void handleMessage(Message msg) { super.handleMessage(msg); test ttt = (test) msg.obj; Log.e("", "" + ttt.test); } }; 問題有三個: Looper.loop()如果不放的話,handleMessage還是接收的到數據 放與不放只差別在後面的block test有沒有跑到而已 1. 我在sendMessage裡面沒有找到dispatchMessage,找到底就是enqueueMessage sendMessage到底是什麼時候call到handleMessage的? 2. 我想要在queue裡面多放一些message來驗證loop(),但我不知道怎麼下手 請問我要如何在其他線程sendMessage到子線程的looper裡面來呢? 3.loop()裡面的死循環是長這樣的 for (;;) { Message msg = queue.next(); // might block if (msg == null) { // No message indicates that the message queue is quitting. return; } 看起來只要沒有message進來就會跳掉了,那到底block在哪個地方呢? 問題有點多,希望有人能幫我解惑... -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 61.221.50.98 ※ 文章網址: https://www.ptt.cc/bbs/AndroidDev/M.1420940115.A.81B.html
kdok123: 沒有人知道嗎QQ 01/11 22:04
ssccg: 1 你handler看起來就不像是bind到你new的Thread 01/12 13:52
ssccg: 所以整個code只是new一個Thread,送message到main thread的 01/12 13:52
ssccg: handler,然後prepare新thread的looper,然後就再也沒用到 01/12 13:53
ssccg: 新開的thread 01/12 13:53
ssccg: 那當然Looper.loop()有沒有一點差都沒有 01/12 13:54
ssccg: 正確的作法是新thread只做Looper prepare、loop 01/12 14:08
ssccg: 然後拿新Thread的looper來建Handler,在別的地方用handler 01/12 14:08
ssccg: sendMessage,就會由這個新Thread處理,而不是在Thread run 01/12 14:09
ssccg: 裡面Looper都沒在跑就手動送,流程不對 01/12 14:09
ssccg: 可以看看 HandlerThread 的source 01/12 14:11
ssccg: 2 使用bind到該looper的Handler,Handler的constructor可以 01/12 14:12
ssccg: 指定Looper,沒有指定就是用目前的Thread 01/12 14:13
ssccg: 3 block在queue.next裡面啊... 通常queue.next是在收到下一 01/12 14:15
ssccg: 個message才return回來,但可能有例外所以下面才多一個檢查 01/12 14:16