为什么我的Bundle里面的android.os.Message被重置了?

时间:2009-11-09 11:19:58

标签: java android mobile

在一个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没有保留在Message中?谁在重置Bundle的值?

3 个答案:

答案 0 :(得分:2)

我知道这是一个旧线程,但由于我在使用带HandlerThread的Handler时遇到了类似的问题,我想添加一些关于我如何解决它的信息。

我注意到在HandlerThread上调用quit后,我的Message实例的内容偶尔会被清除。为了解决这个问题,我使用:Message msgCopy = Message.obtain(msg);在handleMessage回调中使用新引用制作了Message对象的副本。

答案 1 :(得分:1)

问题解决了。基本上在handleMessage方法中,不要将lambdas包装在Runnable中。在原地执行修改。

答案 2 :(得分:0)

如果其他人发现这个问题试图像我一样解决同样的问题:

如果您正在创建这样的消息(例如,将包设置为消息的obj):

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()没有获得设置为消息对象的bundle。

为此,您需要使用:

@Override
public void handleMessage(Message msg) {

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

        ...