Ver Mensaje Individual
  #1 (permalink)  
Antiguo 28/05/2013, 13:31
Avatar de RodMoreno
RodMoreno
 
Fecha de Ingreso: abril-2013
Ubicación: México
Mensajes: 4
Antigüedad: 11 años, 7 meses
Puntos: 0
Pregunta Cómo consumir WebService en otro hilo?

Que tal,

Soy nuevo en el desarrollo Android, he comenzado realizando una aplicación que consume un WebService, es bastante sencillo, me ayude de la biblioteca ksoap2-android.

MainActivity.java
Código Java:
Ver original
  1. package name.rodmoreno.webservice;
  2.  
  3. import android.os.Bundle;
  4. import android.app.Activity;
  5. import android.view.Menu;
  6. import android.widget.TextView;
  7. import android.widget.EditText;
  8. import android.view.View;
  9.  
  10. import org.ksoap2.SoapEnvelope;
  11. import org.ksoap2.serialization.SoapObject;
  12. import org.ksoap2.serialization.SoapSerializationEnvelope;
  13. import org.ksoap2.transport.HttpTransportSE;
  14.  
  15. public class MainActivity extends Activity {
  16.  
  17.     @Override
  18.     protected void onCreate(Bundle savedInstanceState) {
  19.         super.onCreate(savedInstanceState);
  20.         setContentView(R.layout.activity_main);
  21.     }
  22.  
  23.  
  24.     @Override
  25.     public boolean onCreateOptionsMenu(Menu menu) {
  26.         // Inflate the menu; this adds items to the action bar if it is present.
  27.         getMenuInflater().inflate(R.menu.main, menu);
  28.         return true;
  29.     }
  30.  
  31.     public String consumirWS(String Nombre){
  32.         final String SOAP_ACTION = "urn:webserv";
  33.         final String METHOD = "saludo";
  34.         final String NAMESPACE = "urn:webserv";
  35.         final String ENDPOINTWS = "http://192.168.1.65/servicio.php";
  36.         String respuesta = null;
  37.  
  38.         try{
  39.             SoapObject userRequest = new SoapObject(NAMESPACE, METHOD);
  40.             userRequest.addProperty("nombre", Nombre);
  41.  
  42.             SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
  43.             envelope.setOutputSoapObject(userRequest);
  44.  
  45.             HttpTransportSE androidHttpTransport = new HttpTransportSE(ENDPOINTWS);
  46.             androidHttpTransport.debug = true;
  47.             androidHttpTransport.call(SOAP_ACTION, envelope);
  48.  
  49.             respuesta = envelope.getResponse().toString();
  50.         }
  51.         catch (Exception e){
  52.             e.printStackTrace();
  53.         }
  54.  
  55.         return respuesta;
  56.     }
  57.  
  58.     public void enviarNombre(View v){
  59.         TextView textoSalida = (TextView) findViewById(R.id.salida);
  60.         EditText textoEntrada = (EditText) findViewById(R.id.entrada);
  61.  
  62.         textoSalida.setText(consumirWS(textoEntrada.getText().toString()));
  63.     }
  64.    
  65. }

activity_main.xml
Código XML:
Ver original
  1. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  2.    xmlns:tools="http://schemas.android.com/tools"
  3.    android:layout_width="match_parent"
  4.    android:layout_height="match_parent"
  5.    android:paddingLeft="@dimen/activity_horizontal_margin"
  6.    android:paddingRight="@dimen/activity_horizontal_margin"
  7.    android:paddingTop="@dimen/activity_vertical_margin"
  8.    android:paddingBottom="@dimen/activity_vertical_margin"
  9.    tools:context=".MainActivity">
  10.  
  11.     <EditText
  12.            android:layout_width="wrap_content"
  13.            android:layout_height="wrap_content"
  14.            android:inputType="textPersonName"
  15.            android:text="Rodrigo"
  16.            android:ems="10"
  17.            android:id="@+id/entrada" android:layout_alignParentBottom="true" android:layout_alignParentLeft="true"
  18.            android:layout_toLeftOf="@+id/boton"/>
  19.     <Button
  20.            android:layout_width="wrap_content"
  21.            android:layout_height="wrap_content"
  22.            android:text="Enviar"
  23.            android:id="@+id/boton" android:layout_alignParentBottom="true" android:layout_alignParentRight="true"
  24.            android:onClick="enviarNombre"/>
  25.     <TextView
  26.            android:layout_width="wrap_content"
  27.            android:layout_height="wrap_content"
  28.            android:textAppearance="?android:attr/textAppearanceLarge"
  29.            android:text="Hola..."
  30.            android:id="@+id/salida" android:layout_centerVertical="true" android:layout_alignLeft="@+id/entrada"
  31.            android:layout_alignRight="@+id/boton"/>
  32. </RelativeLayout>


En el camino me encontré con un problema yo estaba usando la API 16 y no se ejecutaba y leyendo un poco encontré que desde la API 11 en adelante las conexiones debía hacerlas en otro hilo, por ello mi app no funcionaba.

Quisiera saber, como hacer el mismo ejemplo, pero haciendo la conexión en otro hilo, intenté haciendolo así, pero no conseguí nada.

MainActivity.java
Código Java:
Ver original
  1. package name.rodmoreno.webservice3;
  2.  
  3. import android.os.Bundle;
  4. import android.os.AsyncTask;
  5. import android.app.Activity;
  6. import android.view.Menu;
  7. import android.view.View;
  8. import android.widget.TextView;
  9. import android.widget.EditText;
  10.  
  11. import org.ksoap2.SoapEnvelope;
  12. import org.ksoap2.serialization.SoapObject;
  13. import org.ksoap2.serialization.SoapSerializationEnvelope;
  14. import org.ksoap2.transport.HttpTransportSE;
  15.  
  16. public class MainActivity extends Activity {
  17.     TextView textoSalida;
  18.     EditText textoEntrada;
  19.  
  20.     @Override
  21.     protected void onCreate(Bundle savedInstanceState) {
  22.         super.onCreate(savedInstanceState);
  23.         setContentView(R.layout.activity_main);
  24.  
  25.         textoSalida = (TextView) findViewById(R.id.salida);
  26.         textoEntrada = (EditText) findViewById(R.id.entrada);
  27.     }
  28.  
  29.     @Override
  30.     public boolean onCreateOptionsMenu(Menu menu) {
  31.         // Inflate the menu; this adds items to the action bar if it is present.
  32.         getMenuInflater().inflate(R.menu.main, menu);
  33.         return true;
  34.     }
  35.  
  36.     public void botonClick(View v){
  37.         new consumirWS().execute(textoEntrada.getText().toString());
  38.     }
  39. }
  40.  
  41. public class consumirWS extends AsyncTask<String, Void, Void> {
  42.  
  43.     final String SOAP_ACTION = "urn:webserv";
  44.     final String METHOD = "saludo";
  45.     final String NAMESPACE = "urn:webserv";
  46.     final String ENDPOINTWS = "http://192.168.1.65/servicio.php";
  47.     String respuesta = null;
  48.  
  49.     protected void onPreExecute(){
  50.     }
  51.  
  52.     protected String doInBackground(String Nombre){
  53.         try{
  54.             SoapObject userRequest = new SoapObject(NAMESPACE, METHOD);
  55.             userRequest.addProperty("nombre", Nombre);
  56.  
  57.             SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
  58.             envelope.setOutputSoapObject(userRequest);
  59.  
  60.             HttpTransportSE androidHttpTransport = new HttpTransportSE(ENDPOINTWS);
  61.             androidHttpTransport.debug = true;
  62.             androidHttpTransport.call(SOAP_ACTION, envelope);
  63.         }
  64.         catch (Exception e){
  65.             e.printStackTrace();
  66.         }
  67.  
  68.         return respuesta;
  69.     }
  70.  
  71.     protected void onProgressUpdate(Void... values){
  72.     }
  73.  
  74.     protected void onPostExecute(Void result){
  75.         textoSalida.setText(respuesta).toString();
  76.     }
  77. }

Con este codigo solo consigo este error:
Gradle:
FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':WebService3:compileDebug'.
> Compilation failed; see the compiler error output for details.

* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output.