2011-07-06 46 views
9

我想从我的活动数据发送到服务,并收到了一些资料回来,但我越来越:从服务对象发送到活动(不能元帅非Parcelable)

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

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

回答

0

除了原始数据之外,您在Activities和Services之间玩弄的对象需要实现Parcelable并且最好是Serializable。

我希望这有助于

最佳

-serkan

+0

我msg.obj = 1个这样的价值这是一个primitiv和它不工作,我尝试与实现Serializable的自定义对象,我得到了相同的埃罗。我认为@CommonsWare是对的。我会尝试解决方案,并通知您... –

+0

绝对,让我们知道,谢谢乔治,我很感激。 – serkanozel

5

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

如果使用的是实际的对象,然后通过各种手段,请执行Parcelable Android: How to implement Parcelable to my objects?

然而,由于OP说,他试图用原语和没有工作,这是做什么。

问题就出在这里msg.obj=1;这预计实现Parcelable

使用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的第一次尝试,预计一Parcelable和是实际绊倒我,让我在第一时间搜索。它不会在运行时抛出错误。

6

您可以通过Messenger传递Parcelable类型对象。否则,如果你想通过primitive data types使用Bundle包装如下。

在服务结束:

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

欢呼声:-)

0

必须使用包传递常规类型的数据,否则会出错:

Java.lang.RuntimeException:不能通过编组进程的非可Parcelable对象。

由于Binder事务数据被称为Parcel,必须实现Parcelable接口,否则两个应用程序之间不可能进行通信。之所以Bundle是因为类实现了Parcelable接口而被传递的。当然,如果你想通过这个类,还必须实现这个接口。

,你可以这样写下来:

Message msg = Message.obtain(null, 1); 
msg.getData().putInt("key",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(); 
} 

对不起,我的英语很糟糕

0

为Android我已经实现角色模型(如阿卡),因为阿卡需要Java 8,我使用RxJava2为Android创建了我自己的实现,实现起来非常简单...一旦它在那里,您可以发送包含任何对象的消息给任何接收者(Activity,Fragment,Service,Pojo等),而无需担心线程或序列化

这是很难解释的细节我自己的实现,如果你不知道什么是演员型号,但如果这样做,就可以让一个名为“演员”的接口与一个方法

void onMessageReceived(Message message); 

而且可以实现该接口由你,并注册任何演员任何演员,你可以创建一个有方法的ActorSystem类:

static void register(Actor actor, PublishSubject<Message> mailbox); 
static void unregister(Actor actor); 
static void send(Message message, Class<? extends Actor> ... actors); 

当您注册演员(活动或服务),你决定什么是你的线程/调度程序通过以下方式接收您的消息:

PublishSubject.observeOn(Schedulers.trampoline()); 

而且你的onDestroy()

或者,如果你想为一个库(但我没有测试它),你可以看看这个注册演员的onCreate()和注销:

https://github.com/actorapp/droidkit-actors

相关问题