0

I want to calling asp.net web service in android. (that web service very simple, sum two integers and return result.)

my problem is this: when i run my app and click on button (for giving numbers from text fields and sum by web service and showing result by an AlertDialog) app be Freeze in one status asd don't work. this is my app screenshot in that status (after click on button) : freeze in this status! :-(

and after long time show this massage : "Soap isn't responding. Do you what close it?".

Help me please!

this in my web service codes:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Services;

[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]

// [System.Web.Script.Services.ScriptService]

public class Service : System.Web.Services.WebService
{
public Service () {

    //Uncomment the following line if using designed components 
    //InitializeComponent();  
}

[WebMethod]
public int add (int a, int b) {
    return a + b;

}

}

this is CallSoap, this class call my web service :

import org.ksoap2.SoapEnvelope; 
import org.ksoap2.serialization.PropertyInfo; 
import org.ksoap2.serialization.SoapObject;
import org.ksoap2.serialization.SoapSerializationEnvelope;
import org.ksoap2.transport.HttpTransportSE;
public class CallSoap  
{
public final String SOAP_ACTION = "http://tempuri.org/add";

public  final String OPERATION_NAME = "add"; 

public  final String WSDL_TARGET_NAMESPACE = "http://tempuri.org/";

public  final String SOAP_ADDRESS = "http://s1.azarindk.co.ir/service.asmx";
public CallSoap() 
{ 
}
public String Call(int a,int b)
{
SoapObject request = new SoapObject(WSDL_TARGET_NAMESPACE,OPERATION_NAME);
//PropertyInfo pi =new PropertyInfo();

request.addProperty("a", Integer.valueOf(a));
request.addProperty("b", Integer.valueOf(b));

SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(
SoapEnvelope.VER11);
envelope.dotNet = true;

envelope.setOutputSoapObject(request);

HttpTransportSE httpTransport = new HttpTransportSE(SOAP_ADDRESS);
Object response=null;
try
{
httpTransport.call(SOAP_ACTION, envelope);
response = envelope.getResponse();
}
catch (Exception exception)
{
response=exception.toString();
}
System.out.print(response.toString());
return response.toString();


}
}

and this is a thread for calling CallSoap in main Activity:

package com.example.soap;
public class Caller  extends Thread  
{
public CallSoap cs;
public int a,b; 


public void run(){
    try{
        cs=new CallSoap();
        String resp=cs.Call(a, b);
        MainActivity.rslt=resp;
    }catch(Exception ex)
    {MainActivity.rslt=ex.toString();
    }    
}
}

and this is my main Activity :

package com.example.soap;

import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.app.Activity;
import android.app.AlertDialog;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

public class MainActivity extends ActionBarActivity {

public static String rslt="";
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Button b1=(Button)findViewById(R.id.button1);
    final  AlertDialog ad=new AlertDialog.Builder(this).create();

    b1.setOnClickListener(new OnClickListener() { 

        @Override
        public void onClick(View arg0) {
        // TODO Auto-generated method stub

        CallSoap cs=new CallSoap();

         try
         { 
             EditText ed1=(EditText)findViewById(R.id.editText1);
             EditText ed2=(EditText)findViewById(R.id.editText2); 
             int a=Integer.parseInt(ed1.getText().toString());
             int b=Integer.parseInt(ed2.getText().toString());
             rslt="START"; 

             Caller c=new Caller();
             c.a=a;
             c.b=b; 
        // c.ad=ad;

             c.join();
             c.start();

             while(rslt=="START") {
                 try {
                     Thread.sleep(10); 
                 }catch(Exception ex) {
                 }
             }

             ad.setTitle("RESULT OF ADD of "+a+" and "+b);
             ad.setMessage(rslt); 

         }catch(Exception ex) {
             ad.setTitle("Error!"); ad.setMessage(ex.toString());
         }
         ad.show(); 
     } });

            }

 }

1 Answers1

0

You've got a polling loop on your main thread, which is very bad. This is no better than blocking the main thread with the network transaction itself. Also, it appears that your loop will never terminate since the value of rslt never changes. Lastly, don't use == to compare strings in Java.

Read up on techniques to deal with threaded work in Android. You have a lot of options, but you'll need to follow a good pattern.

Doug Stevenson
  • 297,357
  • 32
  • 422
  • 441