Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


Conexiones de socket y Polling. ¿Cuál es la mejor solución en términos de duración de la batería?

Así que … estoy haciendo una aplicación para Android. La aplicación necesita enviar y recibir datos de chat en tiempo real (necesita ser un socket) pero también necesita enviar comandos (que no lo hacen como el cliente sabe cuando está enviando algo).

Necesito saber cuál es una mejor solución en términos de ahorro de la batería del usuario.

A) Al abrir y cerrar la conexión cada vez que se envía un comando, si se abre la pestaña de chat, mantenga constante la conexión.

B) Mantenga la conexión constante todo el tiempo.

He echado un vistazo alrededor del Internet pero he obtenido respuestas mezcladas, algunos dicen que mantener una conexión persistente es malo para la vida de la batería y otros dicen que no es (Ejemplo: "¿Está usted preguntando si la celebración de una conexión TCP abierta agotará la batería – Vida? Tal vez estoy WAY fuera de aquí, pero, la celebración de una conexión abierta no debe perder la vida de la batería … Si usted piensa que me encantaría saber dónde obtuvo esa información Suena tan extraño para mí.

O si hay otra solución que sería mejor. No creo que el C2DM de Google sería muy útil en absoluto en esta situación tampoco.

Básicamente, lo que drena la batería más: tener una conexión persistente, o abrir y cerrar la conexión a menos que la pestaña de chat está abierto?

¡Gracias!

  • Android: Transmitir datos de la cámara y escribirlos en el servidor
  • Cliente Android y servidor Java Comunicación TCP
  • No se puede conectar a Android a través de ADB a través de wifi - ¿Necesito acceso root?
  • ¿Por qué DefaultHttpClient envía datos a través de un socket semi-cerrado?
  • Conexión adb sobre tcp no funciona ahora
  • ConnectionTimeout versus SocketTimeout
  • ¿Puedo usar tcpdump para obtener peticiones HTTP, encabezado de respuesta y cuerpo de respuesta?
  • ¿Por qué HttpURLConnection de Android no devuelve FIN?
  • 3 Solutions collect form web for “Conexiones de socket y Polling. ¿Cuál es la mejor solución en términos de duración de la batería?”

    Mantener abierta una conexión de socket TCP ociosa (sin enviar o recibir datos) no consumirá (o al menos no debería) más batería que tenerla cerrada. Esto se debe a que una conexión TCP inactiva no utiliza ancho de banda o ciclos de CPU (*).

    Dicho esto, mantener una conexión TCP abierta durante períodos prolongados puede no ser una buena opción para un dispositivo móvil, porque las conexiones TCP no interactúan bien con los equipos que se van a dormir. El escenario del problema sería el siguiente: su usuario Android pone su dispositivo Android en suspenso mientras su aplicación se está ejecutando y, a continuación, el programa del usuario remoto (o lo que está en el otro extremo de la conexión TCP) envía algunos datos a través del flujo TCP. El programa del usuario remoto nunca obtiene ningún ACK de nuevo desde el dispositivo Android, porque por supuesto el dispositivo Android está dormido, por lo que la pila TCP del dispositivo remoto asume que los paquetes TCP enviados deben haberse perdido y responde aumentando su período de tiempo de espera, Disminuyendo su tamaño de ventana TCP (también conocido como número de paquetes TCP permitidos en vuelo en una vez) y reenviando los paquetes TCP. Pero el dispositivo Android todavía está dormido, y así ocurre lo mismo de nuevo. El resultado es que unos minutos más tarde, el extremo remoto de la conexión TCP se ha ralentizado hasta el punto de que incluso si el dispositivo Android se despertara, la conexión TCP probablemente será demasiado lenta para ser utilizable. Programa necesitará cerrar la conexión TCP atascada abajo y comenzar una nueva de todos modos, así que ¿por qué molestarse en mantenerla abierta?

    Así que mi recomendación sería ir con la opción (a), con la estipulación de que se cierra la conexión TCP como parte de su dispositivo-es-va-a-sueño-ahora rutina.

    Una advertencia posible sería si Android tiene una característica en la que mantener una conexión TCP abierta hace que el hardware WiFi o de red celular permanezca encendido en una situación en la que de otro modo podría ponerse a dormir – si ese es el caso, entonces el Android Dispositivo pagaría un coste de batería para alimentar la antena, que de otro modo no tendría que pagar. No soy consciente de ninguna lógica de Android como eso, pero sólo he utilizado Android un poco por lo que podría ser ignorancia de mi parte. Por lo menos vale la pena probarlo.

    (*) Bueno, técnicamente TCP envía un paquete "keepalive" de vez en cuando mientras una conexión TCP está abierta, y eso usa algunos ciclos de CPU y potencia de la antena … pero el intervalo predeterminado para enviar paquetes keepalive en Android es de dos horas , Así que dudo que el poder utilizado para que sea notable.

    Con el fin de mantener una conexión abierta, es probable que tenga que enviar señales de latidos cardíacos hacia adelante y hacia atrás, como cualquier ranuradores con estado entre el dispositivo Android y sus servidores se olvidan de la conexión después de un tiempo relativamente corto.

    Lo que es mejor todo depende de cuánto tiempo piensa que irá sin necesidad de conectarse al servidor. Si usted está conectando alrededor de una vez cada 30 segundos o así la mayor parte del tiempo de todos modos, definitivamente mantener la conexión abierta, pero si no, puede ser mejor cerrarlo.

    La batería está muy relacionada con las transiciones de estado de radio en 3G de DCH / FACH / IDLE. Si desea tener una aplicación que es eficiente en energía que debe enviar la mayor cantidad de datos posible en el intervalo de tiempo limitado irrelevante de una conexión persistente o no …

    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.