Arquitectura MVC ANDROID - 2. Preparando la capa Vista (Enviar datos post a un servidor J2EE desde Android con Threads)

viernes, 4 de enero de 2013


Paso 2 de 2: Preparando la capa Vista (Enviar datos post a un servidor J2EE desde Android con Threads):


Tecnologías

 Android (Threads), JSON (o XML), J2EE (o PHP), DAO (TO: Transfer Object) y MySQL 



/*------------------------------------------------------------------------------------------*/

("El archivo de descarga del proyecto se encuentra al final del artículo")
/*------------------------------------------------------------------------------------------*/

Descripción


Preparamos la capa Vista del patrón MVC para desarrollar una aplicación de 3 capas con un cliente Android que incluya una pantalla de Login.

Arquitectura



Glosario de términos


JSON
JSON, acrónimo de JavaScript Object Notation, es un formato ligero para el intercambio de datos.
JSON es un subconjunto de la notación literal de objetos de JavaScript que no requiere el uso de XML.

Android
Android en un Sistema Operativo además de una plataforma de Software basada en el núcleo de Linux.
Diseñada en un principio para dispositivos móviles, Android permite controlar dispositivos por medio de bibliotecas desarrolladlas o adaptados por Google mediante el lenguaje de programación Java.
Android es una plataforma de código abierto.

Eclipse IDE for Java EE Developers
Entorno de desarrollo para implementar aplicaciones que se ejecutan en dispositivos Android.

Más información y descarga: http://www.eclipse.org/downloads/
Android SDK
Android SDK es el kit de desarrollo necesario para programar e implementar todo tipo de aplicaciones para Android, el sistema operativo para teléfonos móviles propuesto por Google.
Este paquete o kit de desarrollo incluye las APIs y herramientas necesarias para desarrollar aplicaciones utilizando JAVA como lenguaje de programación.

Más información y descarga: 
Threads Android
Sigue este enlace:


Requisitos de Software

Eclipse IDE for Java EE Developers (ADT Eclipse)
SDK Android

Android Login – Capa Vista


Crear un Activity Android, con un diseño visual para que el usuario pueda validarse en el servidor J2EE
Preparamos un diseño visual en XML y enlazamos con un Activity.
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/LinearLayout1"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:padding="10dp"
    tools:context=".Threads_Handler" >

    <ImageView
        android:id="@+id/imageView1"
        android:layout_width="200dp"
        android:layout_height="100dp"
        android:layout_gravity="center_horizontal"
        android:src="@drawable/logo_movil" />

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="right"
        android:text="@string/user"
        android:textAppearance="?android:attr/textAppearanceLarge" />

    <EditText
        android:id="@+id/edtUser"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:ems="10"
        android:hint="Indica tu usuario...."
        android:inputType="textEmailAddress" >

        <requestFocus />
    </EditText>

    <TextView
        android:id="@+id/textView2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="right"
        android:text="@string/pass"
        android:textAppearance="?android:attr/textAppearanceLarge" />

    <EditText
        android:id="@+id/edtPass"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:ems="10"
        android:hint="Indica tu password...."
        android:inputType="textPassword" />

    <Button
        android:id="@+id/btnEnviar"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="right"
        android:text="@string/Enviar" />

</LinearLayout>

Activity (Login)
package com.seas.threads_handler;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;

import com.seas.threads_handler.services.ServiceLogin;
import com.svalero.mvc_sanvalero.beans.Usuario;

public class Threads_Handler extends Activity {
                /*Singleton*/
                               private static Threads_Handler threads_Handler;
                               public static Threads_Handler getInstance(){
                                               return threads_Handler;
                               }
                /*Fin Singleton*/
                private EditText edtUser;
                private EditText edtPass;
                private Button btnEnviar;
                @Override
                protected void onCreate(Bundle savedInstanceState) {
                               super.onCreate(savedInstanceState);
                               setContentView(R.layout.activity_threads__handler);
                               /*Singleton*/
                                               Threads_Handler.threads_Handler = this;
                               /*Fin Singleton*/
                                              
                               edtUser = (EditText)findViewById(R.id.edtUser);
                               edtPass = (EditText)findViewById(R.id.edtPass);
                               btnEnviar = (Button)findViewById(R.id.btnEnviar);
                              
                               btnEnviar.setOnClickListener(new OnClickListener(){
                                               @Override
                                               public void onClick(View arg0) {
                                                               String user = edtUser.getText().toString();
                                                               String pass = edtPass.getText().toString();
                                                               Usuario usuario = new Usuario(user,pass);
                                                               ServiceLogin.accionLogin(usuario);
                                               }
                               });
                }
}

Package services: Herramientas necesarias para realizar una petición a un Servidor J2EE.
Clase Service Login

package com.seas.threads_handler.services;

import java.util.ArrayList;

import org.json.JSONArray;
import org.json.JSONObject;

import android.app.ProgressDialog;
import android.os.Handler;
import android.widget.Toast;

import com.seas.threads_handler.Threads_Handler;
import com.svalero.mvc_sanvalero.beans.Usuario;
import com.svalero.mvc_sanvalero.datos.SanValeroData;
import com.svalero.mvc_sanvalero.tools.Post;
import com.svalero.mvc_sanvalero.tools.UtilsConfig;

public class ServiceLogin {
                private final static Handler manejador = new Handler();
                private static String messageUser;
                private static JSONArray datos;
               
public static void accionLogin(final Usuario usuario){
                               Toast.makeText(Threads_Handler.getInstance().getBaseContext(),
                                                               "Cargando Datos...", Toast.LENGTH_LONG).show();
                               Thread threadLogin = new Thread(){
                                               public void run(){
                                                               try {
                                                                              //Parámetros: ?ACTION=LOGIN&USER=LUIS&PASS=LUIS
                                                                              ArrayList<String> parametros = new ArrayList<String>();
                                                                              parametros.add("ACTION");
                                                                              parametros.add(UtilsConfig.WEBSERVICE_LOGIN);
                                                                               parametros.add(UtilsConfig.WEBSERVICE_LOGIN_PARAMS_USER);
                                                                              parametros.add(usuario.getUser());
                                                                               parametros.add(UtilsConfig.WEBSERVICE_LOGIN_PARAMS_PASS);
                                                                              parametros.add(usuario.getPass());
                                                                              // Llamada a Servidor Web J2EE
                                                                              try {
                                                                                              datos = Post.getServerData(parametros,UtilsConfig.URL);
                                                                              } catch (Exception e) {
                                                                                              messageUser = "Error al conectar con el servidor. ";
                                                                              }
                                                               } catch (Exception e) {
                                                                              messageUser = "Error al conectar con el servidor. ";
                                                               }
                                                               manejador.post(proceso);
                                               }
                               };
                               threadLogin.start();
                }
               
private final static Runnable proceso = new Runnable(){
                               public void run() {
                                               try{
                                                               if (datos != null && datos.length() > 0) {
                                                                              JSONObject json_data = datos.getJSONObject(0);
                                                                              int numRegistrados = json_data.getInt("idUsuario");
                                                                              if (numRegistrados > 0) {
                                                                                              Usuario usuario = new Usuario();                                                                                                   usuario.setIdUsuario(json_data.getInt("idUsuario"));
                                                                                              usuario.setUser(json_data.getString("user"));
                                                                                              usuario.setPass(json_data.getString("pass"));
                                                                                             
                                                                                              SanValeroData.setUsuario(usuario);

Toast.makeText(Threads_Handler.getInstance().getBaseContext(),"Usuario correcto. ", Toast.LENGTH_SHORT).show();
                                                                              }
                                                               } else {
                                                                                              Toast.makeText(Threads_Handler.getInstance().getBaseContext(),"Usuario incorrecto. ", Toast.LENGTH_SHORT).show();
                                                                                              Toast.makeText(Threads_Handler.getInstance().getBaseContext(),messageUser, Toast.LENGTH_SHORT).show();
                                                               }
                                               }catch(Exception e){}
                               }
                };
}


Package beans
package com.svalero.mvc_sanvalero.beans;

public class Usuario {
       private int idUsuario;
       private String user;
       private String pass;
      
       public Usuario(String user, String pass) {
             this.user = user;
             this.pass = pass;
       }
       public Usuario() {
       }
       public int getIdUsuario() {
             return idUsuario;
       }
       public void setIdUsuario(int idUsuario) {
             this.idUsuario = idUsuario;
       }
       public String getUser() {
             return user;
       }
       public void setUser(String user) {
             this.user = user;
       }
       public String getPass() {
             return pass;
       }
       public void setPass(String pass) {
             this.pass = pass;
       }            
}

Package datos (estáticos)
package com.svalero.mvc_sanvalero.datos;

import com.svalero.mvc_sanvalero.beans.Usuario;

public class SanValeroData {
       private static Usuario usuario;

       public static Usuario getUsuario() {
             return usuario;
       }

       public static void setUsuario(Usuario usuario) {
             SanValeroData.usuario= usuario;
       }     
}

Package utils (Post)
package com.svalero.mvc_sanvalero.tools;

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import org.json.JSONArray;

import android.util.Log;

public class Post {

private static InputStream is = null;
private static String respuesta = "";

private static synchronized void conectaPost(ArrayList<String> parametros, String URL) {
        ArrayList<BasicNameValuePair> nameValuePairs;
        try {
                HttpClient httpclient = new DefaultHttpClient();
                HttpPost httppost = new HttpPost(URL);
                nameValuePairs = new ArrayList<BasicNameValuePair>();
                if (parametros != null) {
                               for (int i = 0; i < parametros.size(); i += 2) {
                                               nameValuePairs.add(new BasicNameValuePair((String)parametros.get(i), (String)parametros.get(i + 1)));
                               }
                               httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
                }
                HttpResponse response = httpclient.execute(httppost);
                HttpEntity entity = response.getEntity();
                is = entity.getContent();
        } catch (Exception e) {
                Log.e("log_tag", "Error in http connection " + e.toString());
        } finally {

        }
                }
               
private static synchronized void getRespuestaPost() {
                               try {
                                               BufferedReader reader = new BufferedReader(new InputStreamReader(is, "iso-8859-1"), 8);
                                               StringBuilder sb = new StringBuilder();
                                               String line = null;
                               while ((line = reader.readLine()) != null) {
                                               sb.append(line + "\n");
                               }
                               is.close();
                               respuesta = sb.toString();
                               Log.e("log_tag", "Cadena JSon " + respuesta);
                               } catch (Exception e) {
                                               Log.e("log_tag", "Error converting result " + e.toString());
                               }
                }
               
private static synchronized JSONArray getJsonArray() {
        JSONArray jArray = null;
        try {
                jArray = new JSONArray(respuesta);
        }catch (Exception e) {
        }
        return jArray;
                }
               
public static synchronized JSONArray getServerData(ArrayList<String> parametros, String URL) {
        conectaPost(parametros, URL);
        if (is != null) {
                getRespuestaPost();
        }
        if (respuesta != null && respuesta.trim() != "") {
                return getJsonArray();
        } else {
                return null;
        }
    }
}

Package utils (UtilsConfig)
package com.svalero.mvc_sanvalero.tools;

public class UtilsConfig {
       public static String URL = "http://172.17.22.240:8080/AndroidGroupon/Controller";
       public static String WEBSERVICE_LOGIN = "LOGIN";
       public static String WEBSERVICE_LOGIN_PARAMS_USER = "USER";
       public static String WEBSERVICE_LOGIN_PARAMS_PASS = "PASS";
}

Manifest (Permisos de Internet)

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.seas.threads_handler"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="16" />
    <uses-permission android:name="android.permission.INTERNET"/>
    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="com.seas.threads_handler.Threads_Handler"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
</manifest>



Ejecución



  • Comprobar la URL en la que está escuchando nuestra aplicación Web en el Servidor Glassfish. 
  • Sustituir por la IP_LOCAL, no se permiten conexiones "localhost". 
  • Ejecutar el Servidor Web en Netbeans y el proyecto Android. 
public static String URL = "http://172.17.22.240:8080/AndroidGroupon/Controller";






Descargar proyecto en Dropbox: Pincha aquí.

By Alberto Hernández Akkari. 

1 comentarios:

mario lope díez 24 de enero de 2013, 15:19  

Perfecto Alberto muy sencillo de entender y sobretodo util muy util. Aver si acabo examenenes que me queda un mes y colaboro por aqui¡

Publicar un comentario

fsvelectronicainformatica agradece tu comentario.

  © Blogger template On The Road by Ourblogtemplates.com 2009

Back to TOP