将对象从服务发送到活动(无法封送非Parcelable)

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时,有人可以帮助我吗?

dhe*_*ran 8

您可以通过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)

欢呼:-)


fro*_*ous 6

老问题,但我回答所以它可能会帮助将来的某个人.

如果您使用的是实际对象,那么请务必实现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,实际上是让我绊倒并让我在第一时间搜索.它不会在运行时之前抛出错误.


ser*_*zel 0

除了原始数据之外,您在“活动”和“服务”之间处理的对象需要实现 Parcelable,最好是 Serialized。

我希望这有帮助,

最好的

-塞尔坎