RunOnUiThread не может получить доступ к сообщению напрямую - PullRequest
0 голосов
/ 13 мая 2018

Я отправляю сообщение обработчику, который связан с его собственным потоком.В методе handleMessage я пытаюсь обновить пользовательский интерфейс содержимым сообщения, используя runOnUiThread.Это прекрасно работает, если взять параметр obj сообщения из handleMessage и назначить его новой конечной переменной.Но если я не использую это назначение и не принимаю msg.obj непосредственно в runnable, переменная obj будет нулевой, даже если ссылка 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());
                    }
                });
            }

1 Ответ

0 голосов
/ 13 мая 2018

Я предполагаю, что операционная система повторно использует эти Message объекты, а не создает новые.К тому времени, когда ваш Runnable начнет работать в потоке пользовательского интерфейса, Message будет возвращен в пул, и его поля будут установлены в null.Существование obtainMessage() подтверждает эту гипотезу.

...