Meilleure façon de mettre en œuvre Socket.io in android
j'envisage de mettre en place Socket.io in android by bibliothèque pour une application basée sur le chat. Que j'ai compris la bibliothèque semble être assez bon. Je veux savoir comment faire pour maintenir une connexion socket tout au long de l'application tout le temps? Ici, j'ai énuméré les moyens à atteindre, dans lequel j'ai besoin de la meilleure et stable façon.
trois voies
MainApplication extension de la classe Application
par ceci nous avons une bonne portée que la connexion socket est maintenue dans le thread principal (ou le cycle de vie de l'application) et chaque fois que l'instance socket est nécessaire à partir de l'activité, nous pouvons l'obtenir facilement. Mais c'est le fil principal qui est aussi le problème. Ça pourrait bloquer le fil principal.
BoundService
de cette façon, nous pouvons bind le service avec les activités et nous pouvons il suffit de l'utiliser. Faire dans un thread séparé est la façon de réaliser les appels IO/réseau. Mais le traitement croisé des transferts est plus coûteux que l'accès direct dans le même processus.
Singleton
maintenir la connexion à Singleton a aussi du sens. Mais nous ne savons pas quand l'instance est tuée par le processus, parce qu'elle ne fonctionne pas dans le cycle de vie de l'activité.
si je suis raisonnable, Aidez-moi. Si pas de commentaires.
Modifier
j'ai donné la réponse qui me convient le mieux.
4 réponses
tout d'abord, l'Application est onCreate()
n'est pas pertinent dans votre cas d'utilisation car vous ne pouvez pas avoir un thread en arrière-plan lorsqu'il a été initié pour la première fois dans un code non-service.
aussi, je recommande d'utiliser Google Cloud Messaging au lieu de créer votre propre mécanisme. Il serait préférable que l'appareil de vie de la batterie et beaucoup moins de code pour vous de gérer.
si vous voulez implémenter ce chat complètement par vous-même,Service
est votre seul choix. Vous pouvez aussi le combiner avec un singleton, mais je ne recommanderais pas cette approche. Vous pouvez utiliser émissions et Service et Activity
je pense que c'est plus facile que d'un Lié Service depuis à la limite du service est asynchrone et cela crée beaucoup de dégâts par rapport à la simple diffusion.
Service de maintien socket
connexion
Comme par Ofek Ron mentionnés Service
BroadcaseReceiver
est un mieux idée que BoundService
. Parce que c'est un processus fastidieux pour maintenir la communication. Et je recommande aussi pub/sub
façon de diffuser, comme Otto
ou EventBus
(je suggère moi-même Otto by Square, qui est propre et brillante api).
Pros of OTTO
1. Cleaner Api
2. Vous pouvez vous abonner et publier dans/à n'importe quel Activity
,Fragment
,Service
classe.
3. Découplage. (Vous devez faire un couple aussi petit que possible dans votre code).
Et un point de plus est utiliser START_STICKY
dans le onStartCommand()
pour commencer le service après sa destruction. Voir de référence.
MainApplication pour démarrer le service
il est préférable de lancer le service dans le MainApplication
qui s'étend Application
. Parce que l'application sera tuée quand il y a une contrainte de mémoire ou l'utilisateur ferme l'application avec force de la pile. Donc onStartCommand()
ne sera pas appelé fréquemment comme si nous avions mis en œuvre en activité.
la mise en Œuvre de statut en ligne
vous pouvez implémenter le statut en ligne simplement en implémentant Application.LifeCycleCallbacks
dans le MainApplication
class, qui a la plupart des callbacks du cycle de vie de l'activité et sera notifié dans le callback. Par que vous pouvez mettre en œuvre Online
statut simplement sans aucun code de Plaque de chaudière. (Si quelqu'un a besoin d'aide ici, faites le moi savoir).
téléchargement ou téléchargement d'images ou de fichiers.
la meilleure pratique est de mettre en oeuvre par IntentService
parce que c'est un fil séparé. Je promets qui donnera la meilleure performance parce qu'il est géré par android lui-même, pas comme les fils créés par nous.
vous pouvez combiner la première et la troisième voie comme:
Créer Socket
dans votre Application
et de les déclarer comme static
. Ainsi, vous pouvez les maintenir et y accéder partout dans votre application. N'oubliez pas de créer des Thread
s pour effectuer les opérations de réseau, vous pouvez utiliser ThreadPool
pour les gérer Thread
. Si vous voulez mettre à jour votre UI à partir de ceux Thread
vous pouvez utiliser Handler
et Message
à la communication avec L'IU Thread
Avant de créer votre propre mise en œuvre d'un socket.io client, vous devez donner à cette bibliothèque une chance: https://github.com/socketio/socket.io-client-java
je l'utilise dans un de mes projets pour communiquer avec un nœud.js server qui fonctionne plutôt bien. En fait, toutes vos suggestions sont correctes et dépendent principalement de ce que vous voulez accomplir. Cependant, un contexte est toujours disponible: le contexte de l'application. Par conséquent, vous devriez garder un singleton exemple Application
la classe et de l'obtenir par getApplicationContext()
.
statut en ligne de l'utilisateur: ici, vous devez créer un service de fond qui est à l'écoute constante pour l'état des utilisateurs. Comme il n'y a pas beaucoup d'informations, cela devrait être correct et ne devrait pas drainer la batterie trop. En outre, vous pouvez envoyer un drapeau s'il y a de nouvelles informations disponibles et seulement s'il y a quelque chose de nouveau, vous démarrez un autre thread, qui reçoit les nouvelles données. Cela garde les données faible.
Chat: les données du chat ne sont transférées que lorsque l'application est active. Donc, cela devrait être fait dans une activité.
le service et l'activité peuvent accéder à l'instance singleton de la socket.client io du contexte de l'application. Tant que vous ne traitez pas de données complexes sur le thread principal, tout va bien. Ainsi, enveloppez vos appels dans un fil séparé et ne les démarrez que lorsqu'ils sont réellement nécessaires.