Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/388.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么我的android.os.Message包被重置?_Java_Android_Mobile - Fatal编程技术网

Java 为什么我的android.os.Message包被重置?

Java 为什么我的android.os.Message包被重置?,java,android,mobile,Java,Android,Mobile,在“活动”中,我有一些代码片段可以触发一条消息: 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( BUND

在“活动”中,我有一些代码片段可以触发一条消息:

        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;
          }
@Override
public void handleMessage(Message msg) {

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

        ...

为什么捆绑包没有保留在消息中?谁正在重置捆绑包的值?

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

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

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


我注意到在HandlerThread上调用quit之后,消息实例的内容偶尔被清除。为了修复它,我在handleMessage回调中复制了一个Message对象,并使用了一个新的引用:
Message msgCopy=Message.get(msg)

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


我注意到在HandlerThread上调用quit之后,消息实例的内容偶尔被清除。为了修复它,我在handleMessage回调中复制了一个Message对象,并使用了一个新的引用:
Message msgCopy=Message.get(msg)

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

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

(其中handlerOfTarget是对目标处理程序的引用)

并尝试像这样接收捆绑包:

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

        ...

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

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

(其中handlerOfTarget是对目标处理程序的引用)

并尝试像这样接收捆绑包:

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

        ...