Почему мой пакет внутри android.os.Message сбрасывается? - PullRequest
0 голосов
/ 09 ноября 2009

В Activity у меня есть фрагмент кода, который запускает сообщение:

        Message m = _handler.obtainMessage( UPDATE_PROGRESS );
        Bundle bundle = new Bundle();
        bundle.putInt( BUNDLE_KEY, 50 );
        m.setData( bundle );
        Log.d( LOG_TAG, "value " + bundle.getInt( BUNDLE_KEY, 0 ) ); // prints 50
        Log.d( LOG_TAG, "sent:" + _handler.sendMessage( m ) ); // prints true

В другой части упражнения я обрабатываю это так:

    public void handleMessage( final android.os.Message msg ) 
    {
        switch( msg.what )
        {
        case UPDATE_PROGRESS:
            post( new Runnable() 
            {
                @Override
                public void run()
                {
                    Bundle aBundle = msg.getData();
                    Log.d( LOG_TAG, "value in bundle=" + 
                         aBundle.getInt( BUNDLE_KEY, 0 ) ); // prints 0

                    Log.d( LOG_TAG, "contains 'progress' : " + 
                         aBundle.containsKey( BUNDLE_KEY ) ); // prints 'false'

                }
            });
            break;
          }

Почему Пакет не сохраняется в Послании? Кто сбрасывает значения Bundle?

Ответы [ 3 ]

2 голосов
/ 19 октября 2012

Я знаю, что это старый поток, но так как у меня была похожая проблема с использованием Handler с HandlerThread, я хотел добавить некоторую информацию о том, как я ее решил.

Я заметил, что содержимое моего экземпляра сообщения время от времени очищалось после вызова quit в HandlerThread. Чтобы исправить это, я сделал копию объекта Message внутри обратного вызова handleMessage с новой ссылкой, используя: Message msgCopy = Message.obtain(msg);.

1 голос
/ 10 ноября 2009

Проблема решена. По сути, в методе handleMessage не заключайте лямбды в Runnable. Выполните ваши изменения на месте.

0 голосов
/ 14 января 2013

В случае, если кто-то еще нашел этот вопрос, пытаясь решить ту же проблему, что и я:

Если вы создаете такое сообщение (т.е. устанавливаете пакет в качестве объекта сообщения):

Bundle myBundle = new Bundle();
myBundle.putString("CODE", "code");

//send bundle to target
handlerOfTarget.obtainMessage(MESSAGE_TRIGGER_RECEIVED, 0, 0, myBundle).sendToTarget();

(где handlerOfTarget - ссылка на обработчик цели)

И пытаюсь получить пачку вот так:

@Override
public void handleMessage(Message msg) {

    case MESSAGE_TRIGGER_RECEIVED:
        Bundle myBundle = msg.getData();
        String code = myBundle.getString("CODE"); //null

        ...

Проблема в том, что msg.getData () не получает пакет, который установлен как объект сообщения.

Для этого вам необходимо использовать:

@Override
public void handleMessage(Message msg) {

    case MESSAGE_TRIGGER_RECEIVED:
        Bundle myBundle = (Bundle) msg.obj;
        String code = myBundle.getString("CODE"); //null

        ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...