¿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í:
- Uso de RoboSpice en un BroadcastReceiver
- Robospice en el contexto android.os.Service
- Uso de RoboSpice y RxJava
- No hay ningún error de este tipo al usar robospice-retrofit y getstream.io
- Detener un proceso de fondo en robospice
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?
- Robospice solicitud nunca termina si la aplicación va en el fondo y luego llega a primer plano?
- ¿Cómo puedo obtener Robospice para tratar cualquier cosa que no sea una respuesta 200 de Retrofit & OKHttp como un error
- ¿Cómo aumentar el tiempo de espera para las solicitudes de reacondicionamiento en robospice android?
- Configuración de la conexión TimeOut en la solicitud de RoboSpice android
- El edificio con maven falla
- Uso de adaptadores de sincronización + Volley / RoboSpice para procesamiento sincronizado de solicitudes de red
- Error de entrada de Duplicate Commons-Io usando Robospice y Android Studio
- Subir una imagen a Google appengine utilizando Robospice con Retrofit
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()); } }