2011-07-06 11 views
9

estoy tratando de enviar datos desde mi actividad a un servicio y recibir información hacia atrás, pero yo estoy haciendo:Enviar Objeto del Servicio de Actividad (No se puede reunir no parcelable)

java .lang.RuntimeException: No se puede ordenar objetos no Parcelable en los procesos .

El código de la actividad se ve así:

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

Cuando fijo msg.obj = something consigo java.lang.RuntimeException, puede alguien ayudarme?

Respuesta

0

Además de los datos primitivos, los objetos con los que se hace malabarismo entre Actividades y Servicios deben implementar Parcelable y preferiblemente Serializable.

espero que esto ayude,

Mejor

-serkan

+0

tengo msg.obj = 1 por lo que el valor es un primitiv y no funciona, he intentado con un objeto personalizado que implementan Serializable y me dieron el mismo erro. Creo que @CommonsWare está bien. Probaré esa solución e informaré al respecto ... –

+0

Absolutamente, manténganos informados, gracias George, lo agradezco. – serkanozel

5

vieja pregunta, pero estoy respondiendo a lo que podría ayudar a alguien en el futuro.

Si está utilizando objetos reales, entonces por todos los medios, por favor implemento parcelable Android: How to implement Parcelable to my objects?

Sin embargo, como el PO indicó que él trató de usar primitivas y no funcionó, esto es lo que hay que hacer.

El problema radica aquí msg.obj=1; Esta espera un objeto real que implementa parcelable

Uso msg.arg1 = 1;

a continuación, puede recuperar el argumento en el lado de servicio utilizando msg.arg1

Por simplicidad yo uso (directamente desde mi código)

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

El -1 es solo una bodega er para mí.

Espero que esto ayude.

Editar: que tener cuidado con

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

Esta firma es equivalente al primer intento de la OP y espera un parcelable y es lo que en realidad me tropezó y me llevó a buscar en el primer lugar. No arrojará un error hasta el tiempo de ejecución.

6

Puede pasar objetos tipo Parcelable a través de Messenger. O bien, si desea pasar primitive data types use el contenedor Bundle como se muestra a continuación.

En Servicio Fin:

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

En la Actividad Final:

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

aplausos :-)

0

debe utilizar el paquete para pasar los datos de tipo convencional, de lo contrario, será incorrecto:

Java.lang.RuntimeException: no se pueden incluir objetos no compartibles en los procesos de Marshal.

Como los datos de la transacción Binder se llaman Parcel, la interfaz Parcelable debe implementarse; de ​​lo contrario, no es posible comunicarse entre las dos aplicaciones. La razón por la cual se pasa el paquete porque la clase implementa la interfaz Parcelable. Por supuesto, si quieres pasar la clase también debes implementar la interfaz.

se puede escribir como abajo:

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

lo siento, mi Inglés es muy malo

0

he implementado Modelo Actor (como Akka) para Android, ya que Akka requiere Java 8, i hice mi propia implementación para Android, usando RxJava2, fue muy fácil de implementar ... Y una vez que está allí, puedes enviar mensajes que contengan cualquier objeto a cualquier receptor (Actividad, Fragmento, Servicio, Pojo, etc.) sin Preocuparse por los hilos o la serialización

Es difícil de explicar mi propia aplicación en detalles si usted no sabe lo que es un actor de modelo, pero si lo hace, puede presentar una interfaz denominada "Actor" con un método

void onMessageReceived(Message message); 

Y se puede aplicar esta interfaz por cualquier actor que tiene, y el registro de cualquier actor, puede crear una clase ActorSystem que tiene métodos:

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

y cuando registre su actor (Actividad o servicio), a decidir lo que es el hilo/planificador para recibir sus mensajes, a través de:

PublishSubject.observeOn(Schedulers.trampoline()); 

Y registre su agente en onCreate() y anular el registro en OnDestroy()

O si quieres una biblioteca para que (pero no he probado es), se puede echar un vistazo a esto:

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

Cuestiones relacionadas