[問題] android looper的問題

看板AndroidDev作者 (小天)時間9年前 (2015/01/11 09:35), 編輯推噓0(0015)
留言15則, 2人參與, 最新討論串1/1
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

01/11 22:04, , 1F
沒有人知道嗎QQ
01/11 22:04, 1F

01/12 13:52, , 2F
1 你handler看起來就不像是bind到你new的Thread
01/12 13:52, 2F

01/12 13:52, , 3F
所以整個code只是new一個Thread,送message到main thread的
01/12 13:52, 3F

01/12 13:53, , 4F
handler,然後prepare新thread的looper,然後就再也沒用到
01/12 13:53, 4F

01/12 13:53, , 5F
新開的thread
01/12 13:53, 5F

01/12 13:54, , 6F
那當然Looper.loop()有沒有一點差都沒有
01/12 13:54, 6F

01/12 14:08, , 7F
正確的作法是新thread只做Looper prepare、loop
01/12 14:08, 7F

01/12 14:08, , 8F
然後拿新Thread的looper來建Handler,在別的地方用handler
01/12 14:08, 8F

01/12 14:09, , 9F
sendMessage,就會由這個新Thread處理,而不是在Thread run
01/12 14:09, 9F

01/12 14:09, , 10F
裡面Looper都沒在跑就手動送,流程不對
01/12 14:09, 10F

01/12 14:11, , 11F
可以看看 HandlerThread 的source
01/12 14:11, 11F

01/12 14:12, , 12F
2 使用bind到該looper的Handler,Handler的constructor可以
01/12 14:12, 12F

01/12 14:13, , 13F
指定Looper,沒有指定就是用目前的Thread
01/12 14:13, 13F

01/12 14:15, , 14F
3 block在queue.next裡面啊... 通常queue.next是在收到下一
01/12 14:15, 14F

01/12 14:16, , 15F
個message才return回來,但可能有例外所以下面才多一個檢查
01/12 14:16, 15F
文章代碼(AID): #1KiTDJWR (AndroidDev)