java - servicios - service binder android
Administrar devoluciones de llamadas de servicio remoto (1)
Si lo entendí bien, todo lo que tiene que hacer es responder a sus solicitudes desde RemoteCallbackList usando la misma interfaz, pero con diferentes estructuras de datos que responden.
Supongo que la forma más sencilla es hacer que las solicitudes le brinden información sobre el tipo de estructura de datos de retorno que desean. La forma más obvia (quizás incluso estúpida) es enviarle el nombre de la clase que tiene que crear y completar. De manera más sofisticada, puede crear una enumeración a la que se le debe ingresar el nombre del elemento y que definirá el nombre correcto. clase de estructura de datos para ser instanciado y devuelto.
La segunda forma es tener algún tipo de solucionador de respuestas, alguna lógica que detecte qué tipo de datos puede querer la solicitud. Pero en mi humilde opinión parece demasiado ambiguo, bastante complicado y no muy conveniente de apoyar.
De todos modos, es bastante dudoso que encuentre una solución universal para este caso, porque no es común.
Espero que esto ayude.
Tengo una situación en la que siento que estoy a punto de reinventar la rueda o recorrer las casas, para manejar algo que ya tiene un ''diseño'', así que antes de hacerlo, esperaba poder obtener una segunda opinión, por favor. .
Tengo un servicio remoto. Es un servicio de primer plano permanente debido a la naturaleza / funcionalidad inusual de la aplicación en sí.
Estoy escribiendo una biblioteca para que las aplicaciones de terceros puedan vincularse al servicio y usar las API que expongo. Como yo mismo estoy manejando el subprocesamiento y la mayoría de las devoluciones de llamada serán de naturaleza asincrónica, estoy usando un enfoque AIDL, con clases personalizadas que están ''Parceladas'' para proporcionar los parámetros necesarios para el Servicio. Todo hasta ahora está funcionando perfectamente.
El constructo de mi código de servicio es muy similar al ejemplo de la API RemoteService , así que me referiré a eso, ya que publicar mi código específico no altera la pregunta.
Al igual que en el ejemplo , la interfaz de cada solicitud guardo en una RemoteCallbackList , que parece ser una solución práctica para algunos otros fundamentos.
Sin embargo, mi Servicio no proporciona la misma información a un grupo de ''receptores en espera'' ya que el uso del siguiente fragmento de código demuestra:
int i = callbacks.beginBroadcast();
while (i > 0) {
i--;
try {
callbacks.getBroadcastItem(i).somethingHappened();
} catch (RemoteException e) {
// The RemoteCallbackList will take care of removing
// the dead object for us.
}
}
callbacks.finishBroadcast();
En cambio, las solicitudes son de muchos tipos diferentes y, por lo tanto, necesito hacer un seguimiento del objeto exacto de la Interfaz al que enviaré los resultados. Cada solicitud individual puede implicar más solicitudes web asíncronas y / o procesamiento y tener que pasar el objeto de devolución de llamada a cada uno de estos (ya sea a través de un constructor o simplemente un parámetro de método) es donde siento que estoy a punto de hacer algo muy tedioso y prolijo para resolver un problema que quizás pueda lograr simplistamente de otra manera?
La tarea sería fácil si pudiera garantizar que la primera solicitud en, sería el primer resultado y, por lo tanto, simplemente use el orden en RemoteCallbackList antes de eliminar la referencia a ellos, pero este no es el caso, debido a los diferentes tiempos de procesamiento de los diferentes tipos de solicitud.
Editar - Parece que RemoteCallbackList está respaldado por un ArrayMap, por lo que creo que no se ordenó de todos modos.
No puedo encontrar ninguna manera documentada de reducir el origen de la devolución de llamada en RemoteCallbackList, aunque incluso si pudiera, por supuesto, necesitaría algún tipo de identificador persistente para saber lo que estaba buscando ... Stumped.
Gracias por leer hasta aquí, cualquier idea es bienvenida.
Editar - A los efectos del pseudo ejemplo. Imagine que las solicitudes API son sobre libros.
// requests
bookExists(String title)
bookContent(String title)
// response
bookExists(boolean exists)
bookContent(ArrayList<String> words, int pageTotal)
Como puede ver en lo anterior, si todo sigue igual, una solicitud remota de un libro más pequeño o la existencia de un libro, puede completarse y estar listo para responder antes de solicitar un libro más largo, incluso si se solicitó después. Aquí es donde tengo que rastrear el ''solicitante'' y es el diseño que busco.