[問題] android looper的問題

作者: kdok123 (小天)   2015-01-11 09:35:12
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在哪個地方呢?
問題有點多,希望有人能幫我解惑...
作者: kdok123 (小天)   2015-01-11 22:04:00
沒有人知道嗎QQ
作者: ssccg (23)   2015-01-12 13:52:00
1 你handler看起來就不像是bind到你new的Thread所以整個code只是new一個Thread,送message到main thread的handler,然後prepare新thread的looper,然後就再也沒用到新開的thread那當然Looper.loop()有沒有一點差都沒有正確的作法是新thread只做Looper prepare、loop然後拿新Thread的looper來建Handler,在別的地方用handlersendMessage,就會由這個新Thread處理,而不是在Thread run裡面Looper都沒在跑就手動送,流程不對可以看看 HandlerThread 的source2 使用bind到該looper的Handler,Handler的constructor可以指定Looper,沒有指定就是用目前的Thread3 block在queue.next裡面啊... 通常queue.next是在收到下一個message才return回來,但可能有例外所以下面才多一個檢查

Links booklink

Contact Us: admin [ a t ] ucptt.com