studio soapobject example ejemplo consumir android android-asynctask ksoap2

soapobject - Android, AsyncTask con kSoap2



ksoap2 android ejemplo (1)

Estoy codificando una aplicación que utiliza principalmente datos obtenidos de un servicio web, y quiero usar AsyncTask para ejecutar las llamadas SOAP en segundo plano ... Soy bastante nuevo para Android (ser un programador de iOS), así que '' Soy un poco nuevo en esto ...

Ahora, tengo una pantalla de inicio de sesión, donde tomo un inicio de sesión proporcionado por el usuario y lo comparo con la información en un servidor ...

Entonces en mi actividad de inicio de sesión:

loginBtn.setOnClickListener(new OnClickListener() { public void onClick(View v) { //Run the connection to authenticate the user AuthenticateConnection mAuth = new AuthenticateConnection(); mAuth.mNumber = number; mAuth.mPassword = pass; mAuth.connection(); } }

y mi clase de jabón es esta:

public class AuthenticateConnection { private static final String SOAP_ACTION = "http://tempuri.org/Authenticate"; private static final String METHOD_NAME = "Authenticate"; private static final String NAMESPACE = "http://tempuri.org/"; private String URL; public Boolean userOK; public String mNumber; public String mPassword; public AuthenticateConnection() { } public void connection() { Singleton service = Singleton.getInstance(); String firstURL = service.getURL(); URL = firstURL + "Parent.svc"; System.out.println("Connection to: " + URL); //Initialize soap request SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME); //Add parameters request.addProperty("login", mNumber); request.addProperty("password", mPassword); //Declare the version of the SOAP request SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11); envelope.dotNet=true; envelope.implicitTypes=true; envelope.setAddAdornments(false); //Prepare request envelope.setOutputSoapObject(request); //Needed to make the internet call HttpTransportSE androidHttpTransport = new HttpTransportSE(URL); //Allow for debugging - needed to output the request androidHttpTransport.debug = true; try { //this is the actual part that will call the web service androidHttpTransport.call(SOAP_ACTION, envelope); //Get the SoapResult from the envelope body. //Object result = envelope.getResponse(); //Object result = envelope.bodyIn; SoapObject sResult = (SoapObject)envelope.bodyIn; String tempID = sResult.getProperty("AuthenticateResult").toString(); //Check if the user exists and has the correct password if(tempID != "-1") { userOK = true; //Store the values in the singleton class service.parentID = sResult.getProperty("AuthenticateResult").toString(); service.parentToken = sResult.getProperty("token").toString(); } //If -1 is returned, then either the number or the password is incorrect else { userOK = false; } } catch(org.xmlpull.v1.XmlPullParserException ex2) { //System.out.println(androidHttpTransport.requestDump.toString()); } catch (Exception e) { e.printStackTrace(); System.out.println(androidHttpTransport.requestDump.toString()); } } }

Entonces mi pregunta es, ¿cómo haría esto con AsyncTask? He estado viendo un tutorial sobre AsyncTask, pero realmente no lo he logrado hasta ahora ...


Tu puedes hacer:

private class ConnectionTask extends AsyncTask<String, Void, Void> { private ProgressDialog dialog = new ProgressDialog(ACTIVITY_NAME.this); protected void onPreExecute() { dialog.setMessage("Connecting..."); dialog.show(); } protected void doInBackground(String... args) { AuthenticateConnection mAuth = new AuthenticateConnection(); mAuth.mNumber = args[0]; mAuth.mPassword = args[1]; mAuth.connection(); } protected void onPostExecute(Void v) { if (dialog.isShowing()) { dialog.dismiss(); } } }

Y luego llámalo:

loginBtn.setOnClickListener(new OnClickListener() { public void onClick(View v) { //Run the connection to authenticate the user new ConnectionTask().execute(number, pass); } }

Su método de connection en AuthenticateConnection debería devolver algo para asegurarse de que el usuario ha sido autenticado. Entonces puede usar ese valor en onPostExecute , algo como esto:

protected void onPostExecute(Integer res) { if (dialog.isShowing()) { dialog.dismiss(); } if (res.intValue() == OK) { /* Maybe start a new Activity ...*/ } else { /* Maybe show a Toast with an error message ...*/ } }

En este caso, la firma de la asynctask cambiará: private class ConnectionTask extends AsyncTask<String, Void, Integer> y doInBackground debería devolver un Integer .

Espero eso ayude.