2016-03-10 9 views
0

Я хочу вызвать веб-службу asp.net в android. (эта веб-служба очень проста, суммирует два целых числа и возвращает результат.)callig C# веб-сервис в android

моя проблема заключается в следующем: когда я запускаю свое приложение и нажимаю кнопку (для ввода чисел из текстовых полей и суммирования с помощью веб-службы и отображения результата AlertDialog) app be Freeze в одном статусе asd не работает. это мой скриншот приложения в этом состоянии (после щелчка на кнопке): freeze in this status! :-(

и после долгого времени показывают этот массаж: «Soap не отвечает ли вам, что закрыть его?» .

Помогите мне пожалуйста!

это в моих кодов веб-служб:

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; 

} 

} 

это CallSoap, этот класс называют мой веб-сервис:

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(); 


} 
} 

и это поток для вызова CallSoap в основной деятельности:

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(); 
    }  
} 
} 

и это моя основная деятельность:

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(); 
    } }); 

      } 

} 

ответ

0

У вас есть петля опроса на вашей основной теме, что очень плохо. Это не лучше, чем блокирование основного потока самой транзакцией сети. Кроме того, похоже, что ваш цикл никогда не завершится, так как значение rslt никогда не изменится. Наконец, не используйте == для сравнения строк в Java.

Ознакомьтесь с техникой работы с многопоточной работой в Android. У вас много вариантов, но вам нужно следовать хорошему шаблону.

+0

благодарит Doug, :-) –

 Смежные вопросы

  • Нет связанных вопросов^_^