cmg*_*rge 10 java android runtimeexception
我正在尝试将数据从我的活动发送到服务并收回一些信息,但我得到了:
java.lang.RuntimeException:无法跨进程封送非Parcelable对象.
活动中的代码如下所示:
Message msg = Message.obtain(null, 1);
msg.obj=1;
msg.replyTo=new Messenger(new PlanRequestIncomingHandler());
try {
msgService.send(msg);
} catch (RemoteException e) {
Log.i(tag, "Can not send msg to service");
e.printStackTrace();
}
Run Code Online (Sandbox Code Playgroud)
当我设置msg.obj = something我得到java.lang.RuntimeException时,有人可以帮助我吗?
您可以通过Messenger 传递Parcelable类型的对象.否则,如果要传递原始数据类型,请使用Bundle wrapper,如下所示.
在服务端:
//Create a bundle object and put your data in it
Bundle bundle = new Bundle();
bundle.putInt("key", 1);
Message msg = Message.obtain(null, 123);
msg.obj = bundle;
msg.replyTo = new Messenger(new PlanRequestIncomingHandler());
try {
msgService.send(msg);
} catch (RemoteException e) {
Log.i(tag, "Can't send msg to service");
e.printStackTrace();
}
Run Code Online (Sandbox Code Playgroud)
在活动结束时:
switch(msg.what) {
case 123:
if(msg.obj != null) {
Bundle bundle = (Bundle) msg.obj;
System.out.println("Got integer "+ bundle.getInt("key"));
}
break;
}
Run Code Online (Sandbox Code Playgroud)
欢呼:-)
老问题,但我回答所以它可能会帮助将来的某个人.
如果您使用的是实际对象,那么请务必实现Parcelable Android:如何实现Parcelable到我的对象?
但是,由于OP表示他尝试使用Primitives并且它不起作用,这就是该做什么.
问题出在这里 msg.obj=1;这需要一个实现Parcelable的实际对象
使用 msg.arg1 = 1;
然后,您可以使用在服务端检索参数 msg.arg1
为简单起见,我使用(直接来自我的代码)
Message msg = Message.obtain(null, PlayerService.MSG_ACTION_SEEK, i, -1);
Run Code Online (Sandbox Code Playgroud)
-1对我来说只是一个持有人.
希望这可以帮助.
编辑:小心
Message msg = Message.obtain(null, PlayerService.MSG_ACTION_SEEK, i);
这个签名相当于OP的第一次尝试,并期望一个Parcelable,实际上是让我绊倒并让我在第一时间搜索.它不会在运行时之前抛出错误.