Writing the chapter 6
authorgumartinm <gustavo@gumartinm.name>
Thu, 15 Nov 2012 02:59:51 +0000 (03:59 +0100)
committergumartinm <gustavo@gumartinm.name>
Thu, 15 Nov 2012 02:59:51 +0000 (03:59 +0100)
capitulo6/capitulo6.tex
source/JavaHTTPGet.java [new file with mode: 0644]
source/JavaHTTPGetHandler.java [new file with mode: 0644]
source/JavaHTTPJSONtreatment.java [new file with mode: 0644]
source/JavaUpdateLocation.java [new file with mode: 0644]

index b36e72b..8bafc18 100644 (file)
@@ -1 +1,30 @@
 \chapter{Desarrollo}
+
+Durante la fase de desarrollo se implementará y documentará la aplicación. Para la implementación de la aplicación Android se eligió el IDE Eclipse con el plugin Android para el desarrollo de aplicaciones para esta plataforma. En cambio, para la Web, se usó PHP como lenguaje de programación y como IDE vim\footnote{Para conocer más acerca del mejor editor de textos del mundo (¡y no provoca dolores en los dedos meñiques!) ver: \url{http://www.vim.org/}} con ctags. En realidad para Android (programación Java) también podría haberse usado vim pero el desarrollador deseaba experimentar con el popular y no tan poderoso Eclipse.
+
+No es objetivo de esta memoria explicar cada una de las líneas de código de las que se componen las aplicaciones implementadas, por tanto, en este capítulo lo que se mostrará será todos los pasos que con lleva la realización de una determinada acción que se ha considerado es representativa del funcionamiento global del sistema. Junto a esta acción se mostrarán y explicarán algunas partes del código que sirven para que el lector entienda qué elementos software ha habido que desarrollar para que dicha acción llegue a buen puerto.
+
+La documentación ha sido realizada durante la codificación de la aplicaciones usando Javadoc y phpDocumentor 2. Ambos se basan en la interpretación de los comentarios escritos en las clases y métodos para crear documentación en diversos formatos que pueden ser accedidos por usuarios que quieran conocer o tengan que usar o reutilizar el código implementado.
+
+\section{Conexiones HTTP Cliente - Servidor}
+
+Desde el cliente y tras un cambio de posición geográfica de un usuario, el dispositivo móvil envía las coordenadas vía una petición GET HTTP al servidor Web. Primero la aplicación creará un nuevo hilo para que puedan ejecutarse varias peticiones HTTP en paralelo, tal y como se muestra en el Listado~\ref{list:JavaUpdateLocation}). Se recibe la nueva localización enviada por el sistema operativo Android cuando ésta varía y después se lanza una tarea mediante la instancia exec que es un objeto del tipo ExecutorService proporcionado por Java para poder lanzar y gestionar hilos de una forma sencilla. Básicamente mediante el método execute estamos diciendo a Android que construya un nuevo hilo donde las tareas batch o en segundo plano serán ejecutadas.
+
+
+\lstset{language=Java, basicstyle=\small, breaklines=true, float=[P], floatplacement={P}, frame=single, captionpos=b, caption={Código para la ejecución de tareas en paralelo}, label={list:JavaUpdateLocation}}
+\lstinputlisting{source/JavaUpdateLocation.java}
+
+Posteriormente se lanza la petición al servidor Web en el hilo creado mediante el método execute del Listado~\ref{list:JavaUpdateLocation}), esta petición es llevada a cabo por una instancia de la clase AndroidHttpClient proporcionada por la API Android. Esta instancia se muestra en el Listado~\ref{list:JavaHTTPGet}) con el nombre httpClient. Como parámetros de entrada necesita un handler que trate la respuesta del servidor y una instancia representando la petición HTTP a realizar (GET, PUT, DELETE o POST). El código del handler se muestra en el Listado~\ref{list:JavaHTTPGetHandler}) y el resultado devuelto por dicho handler es almacenado como un objeto del tipo StringBuilder retornado por httpClient.
+
+\lstset{language=Java, basicstyle=\small, breaklines=true, float=[P], floatplacement={P}, frame=single, captionpos=b, caption={Código para la conexión con el servidor Web}, label={list:JavaHTTPGet}}
+\lstinputlisting{source/JavaHTTPGet.java}
+
+\lstset{language=Java, basicstyle=\small, breaklines=true, float=[P], floatplacement={P}, frame=single, captionpos=b, caption={Código para la recepción de datos desde el servidor Web}, label={list:JavaHTTPGetHandler}}
+\lstinputlisting{source/JavaHTTPGetHandler.java}
+
+El StringBuilder contiene la respuesta JSON devuelta por el servidor Web. En el Listado~\ref{list:JavaHTTPJSONtreatment}) se muestra como el StringBuilder es transformado a un Array de objetos JSON (el servicio Web responde con una secuencia donde cada objeto JSON contiene los datos de un anuncio) El método updatedIndexer actualizará tal y como su nombre indica la base de datos con la información sobre el nuevo anuncio y si todo va bien mediante otra conexión HTTP realizada por el método downloadAds la aplicación Android descargará la imagen que está asociada con un anuncio. En caso de que el anuncio ya estuviera descargado, se encontraría en la base de datos y updatedIndexer devolvería null y por tanto no se descargaría nada ni se actualizaría la base de datos con información que ya existía previamente.
+
+En el Listado~\ref{list:JavaHTTPJSONtreatment}) se observa también la existencia del método sendBroadcast. Habíamos mencionado previamente que la tarea de descarga de anuncios se ejecutaba en segundo plano por parte de un Servicio Android multihilo. Necesitamos un mecanismo para por un lado actualizar la interfaz del usuario mostrando los nuevos anuncios recibidos y por otro generar una notificación en la barra de tareas del dispositivo Android. Para llevar a cabo estos requerimientos se hace uso de un BroadCastReceiver proporcionado por la API Android que notificará a las Activities que escuchen dicho broadcast sobre la necesidad de actualizar los datos que están mostrando al usuario.
+
+\lstset{language=Java, basicstyle=\small, breaklines=true, float=[P], floatplacement={P}, frame=single, captionpos=b, caption={Código para la persistencia de los datos recibidos}, label={list:JavaHTTPJSONtreatment}}
+\lstinputlisting{source/JavaHTTPJSONtreatment.java}
diff --git a/source/JavaHTTPGet.java b/source/JavaHTTPGet.java
new file mode 100644 (file)
index 0000000..0166126
--- /dev/null
@@ -0,0 +1,2 @@
+httpGet.setURI(url.toURI());
+StringBuilder builder = httpClient.execute(httpGet, handler);
diff --git a/source/JavaHTTPGetHandler.java b/source/JavaHTTPGetHandler.java
new file mode 100644 (file)
index 0000000..ac65e39
--- /dev/null
@@ -0,0 +1,5 @@
+ResponseHandler<StringBuilder> handler = new ResponseHandler<StringBuilder>() {
+    public StringBuilder handleResponse(HttpResponse response) throws ClientProtocolException, IOException {
+        return sortResponse(response);
+    }
+};
diff --git a/source/JavaHTTPJSONtreatment.java b/source/JavaHTTPJSONtreatment.java
new file mode 100644 (file)
index 0000000..c448934
--- /dev/null
@@ -0,0 +1,18 @@
+JSONTokener tokener = new JSONTokener(builder.toString());
+JSONArray finalResult = new JSONArray(tokener);
+Uri uriInsert = null;
+
+for (int i = 0; i < (finalResult.length() -1); i++) {
+    JSONObject objects = finalResult.getJSONObject(i);
+    if ((uriInsert = updatedIndexer(objects)) != null) {
+        try {
+            downloadAds((String)objects.get("image"), (String) objects.get("id"));
+            Intent updateList = new Intent("de.android.mobiads.MOBIADSLISTRECEIVER");
+            context.sendBroadcast(updateList);
+            updateNotification();
+        } catch (Throwable e1) {
+            context.getContentResolver().delete(uriInsert, null, null);
+            context.deleteFile((String) objects.get("id"));
+        }
+    }
+}
diff --git a/source/JavaUpdateLocation.java b/source/JavaUpdateLocation.java
new file mode 100644 (file)
index 0000000..1624330
--- /dev/null
@@ -0,0 +1,10 @@
+public void makeUseOfNewLocation(Location loc) {
+        
+    final String latitude = Double.toString(loc.getLatitude());
+    final String longitude = Double.toString(loc.getLongitude());
+    //RESTful WebService
+    final String URLAuth = urlServer + latitudeReplace + "/" + longitudeReplace + "/gpsads.json";
+    URL url = new URL(URLAuth);
+    
+    this.exec.execute(new Batch(url));
+}