Conexión persistente en Android con RestTemplate

By | 7 enero 2014

Una de las cuestiones a tener en cuenta a la hora de trabajar con Android y servidores de aplicaciones o especialmente con servidores web donde podemos tener la necesidad de trabajar con login de usuarios en ámbito de sesión es la capacidad de proveer a nuestra aplicación Android de una conexión persistente.

La mayoría de aplicaciones Android que he visto hasta la fecha trabajan con tokens y otro tipo de estrategias parecidas a la hora de trabajar con logins de usuarios, pero un servidor, que viene del desarrollo de plataformas web no terminaba de estar convencido de esta técnica. Y no debo de ser el único, ya que Apple en su API de iOS provee por defecto un sistema de conexión persistente para el desarrollo de sus aplicaciones, pero Google en Android no…

Para desarrollar nuestra aplicación Android con una conexión persistente que nos permita manipular desde nuestro servidor de aplicaciones las conexiones como si se tratase de un navegador web, tenemos que administrar nosotros mismos la creación y reutilización de la conexión empleada en nuestra aplicación Android.

Ademas de esto, como buen amante de todo lo creado por el equipo de SpringSource, utilizo en mis desarrollos móviles Spring Android, así que nuestro sistema de conexión persistente estará integrado con la clase principal de esta librería, RestTemplate.

package com.pjcom.net.httpclient;

import org.apache.http.conn.ClientConnectionManager;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager;
import org.apache.http.params.HttpConnectionParams;
import org.apache.http.params.HttpParams;
import org.apache.http.params.HttpProtocolParams;
import org.springframework.http.client.ClientHttpRequestFactory;
import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
import org.springframework.web.client.RestTemplate;

/**
 *
 * @author Daniel Pardo Ligorred @ www.yizztech.com
 *
 */
public class HttpClientFactory {

	private static DefaultHttpClient defaultHttpClient;
	private static final int HTTP_CONNECTION_TIMEOUT = 15000;

	private synchronized static DefaultHttpClient getThreadSafeClient() {

		if (defaultHttpClient != null) {

			return HttpClientFactory.defaultHttpClient;
		}

		HttpClientFactory.defaultHttpClient = new DefaultHttpClient();

		ClientConnectionManager mgr = HttpClientFactory.defaultHttpClient
				.getConnectionManager();

		HttpParams params = defaultHttpClient.getParams();

		HttpProtocolParams.setUserAgent(params, "PJCOM-ANDROID v1.0");
		HttpConnectionParams.setConnectionTimeout(params,
				HTTP_CONNECTION_TIMEOUT);

		HttpClientFactory.defaultHttpClient = new DefaultHttpClient(
				new ThreadSafeClientConnManager(params, mgr.getSchemeRegistry()),
				params);

		return HttpClientFactory.defaultHttpClient;
	}

	private static synchronized ClientHttpRequestFactory getClientHttpRequestFactory() {

		return new HttpComponentsClientHttpRequestFactory(
				HttpClientFactory.getThreadSafeClient());
	}

	public static synchronized RestTemplate getRestTemplate() {

		return new RestTemplate(HttpClientFactory.getClientHttpRequestFactory());
	}
}

En esta clase es donde disponemos del Singleton que hace posible la reutilización de la conexión en las diferentes llamadas que realice nuestra aplicación Android.

Como podemos ver se trata de una clase con atributos y métodos de tipo static, evidente si estamos hablando de un Singleton.

Su utilización, tratándose de una clase con un solo método public parece bastante obvia, unicamente tendremos que llamar a HttpClientFactory.getRestTemplate() para obtener nuestra nueva conexión o esta misma si ya existe y va a ser reutilizada.

Con esto ya tenemos nuestra conexión persistente, ahora en el lado del servidor de aplicaciones tendremos que gestionar los posibles errores de expired session si utilizamos algún tipo de login en ámbito de sesión, etc…

Comparte esta entrada enShare on LinkedIn0Tweet about this on Twitter0Share on Facebook0Share on Google+0

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos necesarios están marcados *