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.

18
demandé sur ImMathan 2015-08-19 20:51:09

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.

6
répondu Ofek Ron 2018-03-23 07:58:06

Service de maintien socket connexion

Comme par Ofek Ron mentionnés ServiceBroadcaseReceiver 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.

5
répondu ImMathan 2018-03-23 07:58:40

vous pouvez combiner la première et la troisième voie comme:

Créer Socketdans 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 Threads 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

1
répondu mr.icetea 2015-08-26 09:47:48

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.

0
répondu Denis Loh 2015-08-26 15:28:49