¿Puedo usar SpiceManager dentro de un servicio?

Estoy intentando conectar un SpiceManager al servicio, pero estoy recibiendo:

 java.lang.ClassCastException: android.os.BinderProxy cannot be cast to com.octo.android.robospice.SpiceService$SpiceServiceBinder at com.octo.android.robospice.SpiceManager$SpiceServiceConnection.onServiceConnected(SpiceManager.java:1072) at android.app.LoadedApk$ServiceDispatcher.doConnected(LoadedApk.java) at android.app.LoadedApk$ServiceDispatcher$RunConnection.run(LoadedApk.java) at android.os.Handler.handleCallback(Handler.java) at android.os.Handler.dispatchMessage(Handler.java) at android.os.Looper.loop(Looper.java) at android.app.ActivityThread.main(ActivityThread.java) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java) at de.robv.android.xposed.XposedBridge.main(XposedBridge.java:115) at dalvik.system.NativeStart.main(Native Method) 

El flujo de servicio parece algo así:

 class MyService extends Service { // ... SpiceManager mSpiceManager = new SpiceManager(UncachedSpiceService.class); // ... @Override public int onStartCommand(Intent intent, int flags, int startId) { mSpiceManager.start(this); mSpiceManager.execute(new MyRequest(), new RequestListener<String>() { // Handle of request }) // ... return START_STICKY; } // + additional calls to mSpiceManager.execute() in other methods } 

¿Esto me da esa excepción de cast de clase tan pronto como se inicia el servicio?

Para usar RoboSpice, la entidad (contexto) que utiliza un SpiceManager y el SpiceService debe vivir dentro del mismo proceso.

RoboSpice actúa como un puente entre un Servicio de Android y cualquier otro contexto. Y este puente está orientado a objetos, permitiendo un canal de comunicación bidireccional basado en objetos entre el contexto y el servicio.

Eso es posible en Android en una sola condición: el SpiceService y la entidad que utiliza el SpiceManager deben vivir en el proceso. Ese "truco" muy especial es un comportamiento codificado en Android, llamado "Servicio Local de Bindbing".

Si esta condición no se mantiene, no es posible enlazar a un servicio RS de la manera correcta. Cuando el SpiceManager se vincule al SpiceService recibirá un BinderProxy con el que no es posible compartir referencias: todas las comunicaciones deberán basarse en Bundles, objetos serializables o parcelables. En tal condición, RS no funcionará en absoluto.

He mirado su proyecto en https://github.com/rovo89/XposedBridge/blob/master/src/de/robv/android/xposed/XposedBridge.java y parece que usted está jugando con las cosas de nivel muy bajo en él , Y lanzar nuevos procesos Zygote desde allí. Supongo que los procesos que creas al bifurcar zygote no estarán dentro del mismo proceso que el SpiceService en sí mismo, esa es la razón por la que obtienes esta excepción.

Lamento mucho decirlo, pero no puedes usar RoboSpice en este proyecto. Si alguna vez encuentras una solución, estaría muy interesado en saber de ti, pero no creo que vaya a ser posible, por el diseño de Android mismo.

No puede llamar a un servicio / subproceso de fondo de un subproceso de fondo.

Puedes lograrlo así.

 public void callService() { try { org.springframework.web.client.RestTemplate rt = new org.springframework.web.client.RestTemplate(); rt.getMessageConverters().add( new MappingJacksonHttpMessageConverter()); String url = "xyz"; Contacts contacts = rt.postForObject(url, body, Contacts.class); } } catch (Exception e) { e.printStackTrace(); Log.e(TAG, "Called-" + e.toString()); } } 
  • ¿Cómo usar Mockito para probar las API a lo largo de Robospice y Retrofit?
  • ¿Cómo conectarse a una solicitud pendiente con RoboSpice (Splash> Actividad principal)?
  • Cambiar ConnectionTimeout de Retrofit OkHttpClient en tiempo de ejecución
  • Android: cómo recuperar el objeto JSON en caso de una excepción con RoboSpice
  • Robospice - Mantenga el servicio de especias continuando funcionando cuando cambia la actividad
  • ¿Es realmente necesario RoboSpice shouldStop ()?
  • OnStart of new Actividad se llama antes de onStop de padre
  • RoboSpice y ORMLite - Acceso a los datos
  • Borrar datos antiguos de caché con robospice ormlite
  • Objeto de almacenamiento Robospice que extiende ArrayList en la base de datos a través de Ormlite
  • ¿Cómo se genera la clase con T y List <T>
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.