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
...