代码之家  ›  专栏  ›  技术社区  ›  Jacques René Mesrine

为什么我的包在android.os.message中被重置?

  •  0
  • Jacques René Mesrine  · 技术社区  · 16 年前

    在一个活动中,我有一些触发消息的代码片段:

            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;
              }
    

    为什么包没有保存在消息中?谁在重置包的值?

    3 回复  |  直到 7 年前
        1
  •  2
  •   mpowell    13 年前

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

    我注意到在handlerThread上调用quit后,我的消息实例的内容被偶尔清除。为了修复它,我在handleMessage回调中复制了一个带有新引用的消息对象,方法是: Message msgCopy = Message.obtain(msg); .

        2
  •  1
  •   Jacques René Mesrine    16 年前

    问题解决了。基本上在handlemessage方法中,不要将lambda包装在可运行文件中。就地执行修改。

        3
  •  0
  •   ForeverWintr    13 年前

    如果其他人发现这个问题试图解决与我相同的问题:

    如果您正在创建这样的消息(即,将捆绑设置为消息的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()无法获取设置为消息对象的包。

    为此,您需要使用:

    @Override
    public void handleMessage(Message msg) {
    
        case MESSAGE_TRIGGER_RECEIVED:
            Bundle myBundle = (Bundle) msg.obj;
            String code = myBundle.getString("CODE"); //null
    
            ...