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

2022-09-04 08:21:51

我正在尝试将活动中的数据发送到服务并接收一些信息,但我得到:

java.lang.RuntimeException:无法跨进程封送非可包裹对象。

来自活动的代码如下所示:

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();
    }

当我设置我得到java.lang.RuntimeException时,有人可以帮助我吗?msg.obj = something


答案 1

您可以通过 Messenger 传递可包裹类型对象。或者,如果要传递基元数据类型,请使用捆绑包包装器,如下所示。

在役端:

//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();
}

在活动结束中:

switch(msg.what) {
    case 123:
        if(msg.obj != null) {
            Bundle bundle = (Bundle) msg.obj;
            System.out.println("Got integer "+ bundle.getInt("key"));
        }
    break;
}

欢呼:-)


答案 2

老问题,但我正在回答,所以它可能会在未来帮助某人。

如果您使用的是实际对象,那么无论如何,请实现可包裹Android:如何实现可包裹到我的对象?

但是,正如OP所说,他尝试使用Primitels并且它不起作用,这就是要做的。

问题就在这里 这期望一个实现可 Parcelable 的实际对象msg.obj=1;

msg.arg1 = 1;

然后,您可以使用以下命令在服务端检索参数msg.arg1

为了简单起见,我使用(直接从我的代码)

Message msg = Message.obtain(null, PlayerService.MSG_ACTION_SEEK, i, -1);

-1对我来说只是一个支架。

希望这有帮助。

编辑:小心

Message msg = Message.obtain(null, PlayerService.MSG_ACTION_SEEK, i);

这个签名相当于OP的第一次尝试,并期望一个Mailable,实际上是绊倒我并让我首先搜索的东西。在运行时之前,它不会引发错误。


推荐