Я отправляю сообщение обработчику, который связан с его собственным потоком. В методе handleMessage я пытаюсь обновить пользовательский интерфейс содержимым сообщения, используя runOnUiThread. Это прекрасно работает, если взять параметр obj сообщения из handleMessage и назначить его новой конечной переменной. Но если я не использую это назначение и беру msg.obj непосредственно в runnable, переменная obj имеет значение null, даже если ссылка msg имеет тот же идентификатор при проверке ссылки msg, переданной в handleMessage перед вызовом runOnUiThread.
Почему это происходит?
Это работает:
bt01.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Message msg = new Message();
msg.obj = new Data("Hi im the message");
mHandler.sendMessage(msg);
}
});
class LooperThread extends Thread {
public void run() {
Looper.prepare();
mHandler = new Handler() {
public void handleMessage(final Message msg) {
final Object messageString = msg.obj;
runOnUiThread(new Runnable() {
@Override
public void run() {
tv01.setText(((Data)messageString).getMessage());
}
});
}
};
Looper.loop();
}
}
Это не работает:
public void handleMessage(final Message msg) {
runOnUiThread(new Runnable() {
@Override
public void run() {
tv01.setText(((Data)msg.obj).getMessage());
}
});
}
HandlerThread
- не нужно изобретать колесо, во-вторых, см. - person pskink   schedule 13.05.2018BroadcastReceiver
? это как убить муху из пушки/кувалды - person pskink   schedule 13.05.2018Message
используются повторно - они попадают в какой-то кеш/пул для повторного использования в будущем - person pskink   schedule 13.05.2018Handler
и одинHandler.Callback
(конечно, вы также можете использовать два пользовательскихHandler
и переопределить их методhandleMessage
), и именно так вы должны обрабатывать свои сообщения, а не использовать какую-то плавающую конечную переменную - person pskink   schedule 13.05.2018"[...] because calling the same callback with different behaviour for handlers with if/else construct doesn't look like good code"
я так не думаю, найдите любойHandler
в исходном коде Android, и вы увидите, что почти любойHandler
обрабатывает несколько действий в зависимости от поляMessage#what
- person pskink   schedule 14.05.2018Message
и вызоваcopyFrom
просто используйтеMessage.obtain(message)
, как здесь - person pskink   schedule 14.05.2018Message#getTarget
, чтобы определить, где обрабатывать вашMessage
- person pskink   schedule 14.05.2018