Android - llamar web service desde App

 
Vista:
sin imagen de perfil

llamar web service desde App

Publicado por Sergio (5 intervenciones) el 13/06/2016 12:15:30
Buenas a todos,

estoy desarrollando para el trabajo una App que permita mandar a un web service un dato y que el web service me de una respuesta.
Lo he hecho en un hilo independiente al hilo principal, pero al dar al boton que lllama al web service la app se cierra.
Estoy perdido y necesito ayuda por favor.
Paso el código que tengo por si alguien puede ayudarme.

Agradezco de antemano cualquier ayuda que me puedan prestar.

Saludos.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
package com.example.sergio.wsprueba;
 
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.view.View;
import android.widget.Toast;
 
import org.ksoap2.SoapEnvelope;
import org.ksoap2.serialization.SoapObject;
import org.ksoap2.serialization.SoapSerializationEnvelope;
import org.ksoap2.transport.HttpTransportSE;
 
public class MainActivity extends Activity {
 
    public static final String NAMESPACE = "urn:lectura";
    public static final String METHOD_NAME = "Test";
    public static final String URL = "http://www.transzuri.com/ws/lectura/index.php?wsdl";
    public static final String SOAP_ACTION = "urn:lectura#Test";
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
 
    final Handler miHandler = new Handler();
 
    protected void miHilo() {
        Thread t = new Thread() {
            public void run() {
                try {
                    Thread.sleep(10000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                miHandler.post(ejecutar);
            }
        };
     t.start();
    }
 
    class ejecutar extends Thread {
        @Override
        public void run() {
            String peticion = "<tns:Test xmlns:tns=\"urn:lectura\"><GUID xsi:type=\"xsd:string\">38B9B858-3B99-43C1-B06D-8750A7028AA4</GUID><BarCode xsi:type=\"xsd:string\">00111166666666601</BarCode></tns:Test>";
 
            SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);
            request.addProperty("request", peticion);
 
            SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
            envelope.setOutputSoapObject(request);
 
            try {
                HttpTransportSE androidHttpTransport = new HttpTransportSE(URL);
                androidHttpTransport.call(SOAP_ACTION, envelope);
                Toast.makeText(getApplicationContext(), "OK!", Toast.LENGTH_SHORT).show();
 
                SoapObject result = (SoapObject) envelope.bodyIn;
 
                if (result != null) {
                    Toast.makeText(getApplicationContext(), result.getProperty(0).toString(), Toast.LENGTH_SHORT).show();
                } else {
                    Toast.makeText(getApplicationContext(), "No response", Toast.LENGTH_SHORT).show();
                }
            } catch (Exception e) {
                e.printStackTrace();
                Toast.makeText(getApplicationContext(), e.toString(), Toast.LENGTH_SHORT).show();
            }
        }
    }
 
    void mensaje(View view) {
        miHilo() hilo = new miHilo();
        hilo.start();
 
    }
}
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil
Val: 444
Oro
Ha mantenido su posición en Android (en relación al último mes)
Gráfica de Android

llamar web service desde App

Publicado por juanki (253 intervenciones) el 13/06/2016 13:30:14
"la aplicación se cierra" Ese es el error más claro y descriptivo que puedes darnos para que te ayudemos....

Creo que últimamente todos mis mensajes son iguales a lo que voy a poner a continuación :(

Lo primero que debes hacer es intentar averiguar por qué se cierra, cual es el error que causó el cierre de la aplicación. Para eso es tan sencillo como que conectes el móvil al ordenador y desde AndroidStudio lances la aplicación, te dará el error y la línea en la que ocurrió, a partir de ahí ya podrás corregir el problema.

Un saludo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil

llamar web service desde App

Publicado por Sergio (5 intervenciones) el 14/06/2016 12:18:01
Ya está resuelto el problema de que se cierre sola la App.
Ahora el problema es que me tira este error y no sé por qué.

android.os.NetworkOnMainThreadException

Alguien sabe algo de esto?

Gracias y saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

llamar web service desde App

Publicado por Esmeralda (11 intervenciones) el 19/06/2016 03:01:53
Hola en este codigo se va mostrando paso a paso para crear el web service sin problemas
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 112
Bronce
Ha disminuido 1 puesto en Android (en relación al último mes)
Gráfica de Android

llamar web service desde App

Publicado por Yamil Bracho (100 intervenciones) el 19/06/2016 04:17:04
El problema es que estas haciebdio la llamada de conexion al WebService (HttpClient o UrlConnection) en la MainThread y en Android esto lo debes hacer en una thread. Puedes usar una AsyncTask para hacer la llamada.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 112
Bronce
Ha disminuido 1 puesto en Android (en relación al último mes)
Gráfica de Android

llamar web service desde App

Publicado por Yamil Bracho (100 intervenciones) el 19/06/2016 04:37:15
Disculpa no habia visto el codigo que publicaste.
El problema es que estas usando un Toast en el hilo donde haces la llamada al servicio y todo lo que es UI debe ejecutarse en el MainThread.
Para ello encierra todos los toast en un hilo que ejecutas con runOnUiThread. Por ejemplo

1
2
3
4
5
6
7
8
9
10
try {
    HttpTransportSE androidHttpTransport = new HttpTransportSE(URL)
    androidHttpTransport.call(SOAP_ACTION, envelope);
 
runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                              Toast.makeText(getApplicationContext(), "OK!", Toast.LENGTH_SHORT).show();
                        }
                    });
...

Lo mas facil, como comente anteriormente es que uses una AsyncTask...
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

llamar web service desde App

Publicado por Sergio (5 intervenciones) el 20/06/2016 08:24:09
Hola, gracias por las respuestas.
El WebService ya lo tengo creado.

He creado un log y la llamada al webservice se queda registrada pero no me devuelve nada.
La idea es pasarle un dato en un EditText y que me devuelva si es correcto o no.

Me podeis echar una manilla por favor?

He modificado el código y he usado AsyncTask.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
package com.example.sergio.async;
 
import android.app.Activity;
import android.app.ProgressDialog;
import android.content.DialogInterface;
import android.content.DialogInterface.OnCancelListener;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;
 
import org.ksoap2.SoapEnvelope;
import org.ksoap2.serialization.SoapObject;
import org.ksoap2.serialization.SoapPrimitive;
import org.ksoap2.serialization.SoapSerializationEnvelope;
import org.ksoap2.transport.HttpTransportSE;
 
public class MainActivity extends Activity {
 
    public static final String NAMESPACE = "urn:lectura";
    public static final String METHOD_NAME = "Test";
    public static final String URL = "http://www.transzuri.com/ws/lectura/index.php?wsdl";
    public static final String SOAP_ACTION = "urn:lectura#Test";
 
    private Button btnAsyncDialog;
    private ProgressBar pbarProgreso;
    private TextView textView;
    private ProgressDialog pDialog;
 
 
    private MiTareaAsincronaDialog tarea2;
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
        btnAsyncDialog = (Button)findViewById(R.id.btnAsyncDialog);
        pbarProgreso = (ProgressBar)findViewById(R.id.pbarProgreso);
        textView = (TextView)findViewById(R.id.textView);
 
 
        btnAsyncDialog.setOnClickListener(new OnClickListener() {
 
            @Override
            public void onClick(View v) {
 
                pDialog = new ProgressDialog(MainActivity.this);
                pDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
                pDialog.setMessage("Procesando...");
                pDialog.setCancelable(true);
                pDialog.setMax(100);
 
                tarea2 = new MiTareaAsincronaDialog();
                tarea2.execute();
            }
        });
    }
 
    private void tareaLarga()
    {
        try {
 
            // Modelo el request
            String GUID = "38B9B858-3B99-43C1-B06D-8750A7028AA4";
 
            SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);
            request.addProperty("request", GUID); // Paso parametros al WS
 
            // Modelo el Sobre
            SoapSerializationEnvelope sobre = new SoapSerializationEnvelope(SoapEnvelope.VER11);
            sobre.dotNet = true;
            sobre.setOutputSoapObject(request);
 
            // Modelo el transporte
            HttpTransportSE transporte = new HttpTransportSE(URL);
 
            // Llamada
            transporte.call(SOAP_ACTION, sobre);
 
            // Resultado
            SoapPrimitive resultado = (SoapPrimitive) sobre.getResponse();
 
            Log.i("Resultado", resultado.toString());
 
 
        } catch (Exception e) {
            Log.e("ERROR", e.getMessage());
        }
    }
 
 
    private class MiTareaAsincronaDialog extends AsyncTask<Void, Integer, Boolean> {
 
        @Override
        protected Boolean doInBackground(Void... params) {
            for(int i=1; i<=10; i++) {
                tareaLarga();
                publishProgress(i*10);
                if(isCancelled())
                    break;
            }
 
            return true;
        }
 
        @Override
        protected void onProgressUpdate(Integer... values) {
            int progreso = values[0].intValue();
 
            pDialog.setProgress(progreso);
        }
 
        @Override
        protected void onPreExecute() {
 
            pDialog.setOnCancelListener(new OnCancelListener() {
                @Override
                public void onCancel(DialogInterface dialog) {
                    MiTareaAsincronaDialog.this.cancel(true);
                }
            });
 
            pDialog.setProgress(0);
            pDialog.show();
        }
 
        @Override
        protected void onPostExecute(Boolean result) {
            if(result)
            {
                pDialog.dismiss();
 
                Toast.makeText(MainActivity.this, "Tarea finalizada!", Toast.LENGTH_SHORT).show();
            }
        }
 
        @Override
        protected void onCancelled() {
            Toast.makeText(MainActivity.this, "Tarea cancelada!", Toast.LENGTH_SHORT).show();
        }
    }
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

llamar web service desde App

Publicado por Sergio (5 intervenciones) el 30/06/2016 11:11:11
Ya está solucionado.
Gracias por las respuestas y la ayuda prestada.

Un saludo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar