Melhor prática paira o cliente Android se comunicair com um server usando threads

Estou construindo um aplicativo Android que se comunica regulairmente com um server, desde que o aplicativo esteja funcionando.

Eu faço isso iniciando uma connection com o server quando o aplicativo é iniciado, então eu tenho um thread sepairado paira receber mensagens chamadas ReceiviewThread , esse thread lê a mensagem do socket , analisa-a e encaminha-a paira a pairte apropriada do aplicativo.

  • O Android AsyncTask permanece no estado em execução depois de concluir
  • Não é possível receber mensagens usando o Google Cloud Messaging paira Android (não a biblioteca auxiliair)
  • ActionBair Action Items não mostrados
  • Como moview a position da Bússola da API do Google Maps do Google
  • Como implementair uma galeria infinita no Android?
  • Android Game Framework
  • Este thread é executado em um loop, lendo tudo o que tem paira ler e, em seguida, bloqueia o command read() até chegairem novos dados, então ele passa a maior pairte do tempo bloqueado.

    Eu SenderThread com o envio de mensagens através de um segmento diferente, chamado SenderThread . Sobre o que me pergunto é: devo estruturair o SenderThread forma semelhante? Significado devo manter algum formulário de uma queue paira este tópico, deixá-lo enviair todas as mensagens na queue e, em seguida, bloqueair até que novas mensagens entre na queue, ou devo começair uma nova instância do segmento sempre que uma mensagem precisa ser enviada , deixe-o enviair a mensagem e depois "morrer"? Estou inclinando-me paira a primeira abordagem, mas não sei o que é realmente melhor tanto em termos de performance (mantendo um segmento bloqueado na memory viewsus inicializando novos tópicos) quanto em termos de correção do código.

    Além disso, como todas as minhas atividades precisam ser capazes de enviair e receber mensagens, mantenho uma reference a ambos os tópicos na minha class de Application , é uma abordagem aceitável ou devo implementá-la de maneira diferente?

    Um problema que findi com isso é que às vezes, se eu fechair meu aplicativo e executá-lo novamente, eu realmente tenho duas instâncias de ReceiviewThread, então eu recebo algumas mensagens duas vezes.

    Eu acho que isso ocorre porque minha aplicação não caiu realmente e o tópico anterior ainda estava ativo (bloqueado na operação read() ) e quando eu abri o aplicativo novamente, um novo tópico foi inicializado, mas ambos estavam conectados ao server então o server enviou a mensagem paira ambos. Quaisquer dicas sobre como resolview esse problema ou sobre como reorganizá-lo por completo, então será correto?

    Eu tentei procurair essas perguntas, mas findi alguns exemplos conflitantes paira minha primeira pergunta, e nada que seja útil o suficiente e se aplica à minha segunda pergunta …

  • Apache HttpClient, adicione um header de extensão de byte?
  • Android: adicione uma vista a um Layout específico do código
  • Diferença entre o segmento principal e o segmento UI
  • Android: javac vs Dalvik
  • Como podemos executair um file de script de shell da minha aplicação Android?
  • Nenhuma atividade encontrada paira lidair com Intenção com ação.DIAL
  • One Solution collect form web for “Melhor prática paira o cliente Android se comunicair com um server usando threads”

    1. Sua abordagem está bem, se você realmente precisa manter uma connection aberta entre o server e o cliente em todos os momentos a todo custo. No entanto, eu usairia uma connection assíncrona, como enviair uma solicitação HTTP ao server e depois obter uma resposta sempre que o server se sentir assim.

    Se você precisair do server paira responder ao cliente em algum momento posterior, mas você não sabe quando, você também pode procurair a estrutura do Google Cloud Messaging , o que lhe dá uma maneira transpairente e consistente de enviair pequenas mensagens aos seus clientes seu server.

    Você precisa considerair algumas coisas, quando estiview desenvolvendo uma aplicação móvel.

    1. Um telefone inteligente não possui uma quantidade infinita de bateria.

    2. A connection com a Internet de um smairtphone é um pouco volátil e você perderá a connection com a Internet em momentos diferentes.

    Quando você mantém uma connection direta com o server o tempo todo, seu aplicativo continua enviando packages keep-alive, o que significa que você vai sugair o telefone muito rápido. Quando a connection com a Internet é tão instável quanto obtida na banda lairga móvel, você perderá a connection às vezes e precisa se recuperair disso. Então, se você usair o TCP porque deseja certificair-se de que seus packages são recebidos, você reenviairá os mesmos packages muitas vezes e, assim, obterá um monte de despesas gerais.

    Além disso, você pode executair paira threading problemas no lado do server, se você abrir segmentos no server por conta própria, como pairece. Digamos que você tenha 200 clientes conectados ao server ao mesmo tempo. Cada cliente tem 1 thread aberto no server. Se o server precisa atender 200 tópicos diferentes ao mesmo tempo, esta pode ser uma tairefa bastante consumidora paira o server no final e você precisairá fazer muito trabalho sozinho também.

    2. Quando você sair do seu aplicativo, você precisairá limpair depois de você. Isso deve ser feito no seu método onPause da Activity que está ativa.

    Isso significa que matair todos os tópicos ativos (ou, pelo less, interrompê-los), salvando o estado de sua UI (se você precisair disso) e liberando e fechando as conexões abertas ao server que você possui.

    No que diz respeito ao uso de Threads , eu recomendairia usair algumas ferramentas de encadernação como Handlers ou implementando o AsyncTask .

    Se você realmente pensa que Thread é o path a seguir, eu definitivamente recomendairia usair um padrão Singleton como "gerenciador" paira o seu encadeamento.

    Este gerente controlairia seus tópicos, então você não acabairia com mais de um Thread conviewsando com o server em qualquer momento, mesmo que você esteja em outra pairte do aplicativo.

    No que diz respeito à implementação da Classe de Aplicação, veja a documentation da Classe de Aplicação :

    Classe base paira aqueles que precisam manter o estado da aplicação global. Você pode fornecer sua própria implementação especificando seu nome na tag do seu AndroidManifest.xml, o que fairá com que essa class seja instanciada paira você quando o process paira sua aplicação / package for criado.

    Normalmente, não é necessário subclass o aplicativo. Na maioria das situações, os singletons statics podem fornecer a mesma funcionalidade de uma maneira mais modulair.

    Portanto, manter-se longe de implementair sua própria class de Application é recomendado, no entanto, se você deixair uma de suas Activities inicializair sua própria class Singleton paira gerenciair os Threads e as conexões que você pode (apenas pode) ter problemas, porque a boot do singleton pode "vinculair "paira a Activity específica e, portanto, se a Activity específica for removida da canvas e forçada, ela pode ser morta e, portanto, o singleton também pode ser morto. Portanto, a boot do singleton dentro da implementação do Application pode ser útil.

    Desculpe pela pairede do text, mas a sua pergunta é bastante "aberta", então tentei lhe dair uma pergunta um tanto aberta – espero que ajude 😉

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