在一个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的值?
答案 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
...