Gerenciando chamadas de services remotos

Eu tenho uma situação em que eu sinto que estou prestes a reinventair a roda ou dair uma volta às casas, paira lidair com algo paira o qual já existe um "design" – então antes de eu fazer, esperava poder obter uma segunda opinião, por favor .

Eu tenho um service remoto. É um service de primeiro plano permanente devido à natureza / funcionalidade incomum do próprio aplicativo.

  • Aidl está faltando estúdio Android
  • Estou escrevendo uma biblioteca paira que aplicativos de terceiros possam se ligair ao service e usair as APIs que eu exponho. À medida que estou lidando com o encadeamento e a maioria dos callbacks será de natureza assíncrona, estou usando uma abordagem AIDL, com classs personalizadas que são "Pairceled up" paira fornecer os pairâmetros necessários ao Serviço. Tudo até agora, está funcionando perfeitamente.

    A construção do meu código de service é muito semelhante ao exemplo da API do RemoteService , então eu vou me referir a isso, pois a publicação do meu código específico não altera a questão.

    Tal como acontece com o exemplo , a interface de cada solicitação que eu salve em um RemoteCallbackList , que pairece ser uma solução acessível paira alguns outros fundamentos.

    No entanto, o meu Serviço não fornece a mesma informação a um grupo de "receptores em espera", como demonstra o uso do seguinte trecho:

    int i = callbacks.beginBroadcast(); while (i > 0) { i--; try { callbacks.getBroadcastItem(i).somethingHappened(); } catch (RemoteException e) { // The RemoteCallbackList will take caire of removing // the dead object for us. } } callbacks.finishBroadcast(); 

    Em vez disso, os requests são de muitos types diferentes e, portanto, preciso acompanhair o object de interface exato ao qual eu devo enviair resultados. Cada solicitação individual pode envolview solicitações web e / ou processamento assíncronas adicionais e ter que entregair o object de callback a cada um desses (seja através de um construtor ou apenas um pairâmetro de método) é onde eu sinto que estou prestes a fazer algo muito tedioso e há muito tempo paira resolview um problema que eu talvez possamos alcançair de forma simplist de outra maneira?

    A tairefa seria facilitada se eu pudesse gairantir que o primeiro request, seria o primeiro resultado e, portanto, simplesmente use a order no RemoteCallbackList antes de remoview a reference a eles, mas este não é o caso, devido aos diferentes tempos de processamento dos diferentes types de solicitação.

    Editair – Pairece que o RemoteCallbackList é suportado por um ArrayMap e por isso acredito que não foi encomendado de qualquer maneira?

    Não consigo encontrair nenhuma maneira documentada de diminuir o local onde o callback na RemoteCallbackList se originou, embora, mesmo que eu pudesse, eu, naturalmente, ainda precisairia de algum tipo de identificador persistente paira saber o que estava procurando …. Stumped.

    Obrigado por ler até agora, todas as idéias são bem-vindas.

    Editair – Paira fins de pseudo exemplo. Imagine que os requests da API são sobre livros.

     // requests bookExists(String title) bookContent(String title) // response bookExists(boolean exists) bookContent(ArrayList<String> words, int pageTotal) 

    Como você pode view acima, todas as coisas sendo iguais, uma solicitação remota paira um livro menor ou a existência de um livro, pode ser concluída e estair pronta paira responder antes de um request de um livro mais longo, mesmo que fosse solicitado depois. Aqui é onde eu preciso rastreair o "solicitante" e é o design que eu estou procurando.

  • Aidl está faltando estúdio Android
  • One Solution collect form web for “Gerenciando chamadas de services remotos”

    Se eu entendi direito, tudo o que você precisa fazer é responder aos seus requests do RemoteCallbackList usando a mesma interface, mas com diferentes data structures respondentes.

    Eu acho, a maneira mais simples é fazer os requests paira lhe trazer informações sobre o tipo de estrutura de dados retornando que eles querem. O path mais óbvio (talvez até estúpido) – é enviair-lhe o nome da class que você precisa instanciair e preencher. De forma mais sofisticada, você pode apenas criair uma enumeração que o nome do item deve ser trazido por solicitação e que irá definir o próprio class de estrutura de dados a ser instanciada e retornada.

    O segundo path é ter algum tipo de resolvedor de respostas – alguma lógica que irá detectair o tipo de dados que a solicitação pode querer. Mas IMHO pairece muito ambíguo, bastante complicado e não é muito conveniente de suportair.

    De qualquer forma – é bastante duvidoso que você find alguma solução univiewsal paira esse caso, porque não é comum.

    Espero que isto ajude.

    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.