Android-код для вызова веб-службы с ошибкой «приложение остановлено неожиданно» - PullRequest
1 голос
/ 01 августа 2011

Я уже некоторое время пытаюсь это сделать, но не могу получить правильный вывод. Я столкнулся с проблемой вызова веб-службы из моего кода Android. Мой код веб-службы возвращает строку с разделителем '#' между ними. Теперь мне нужно создать в Android код, который будет вызывать веб-сервис, разделять разделители так, чтобы фактические имена отображались с помощью флажка, чтобы пользователь мог выбрать

Вот мой код Android:

    package com.sencide;

    import java.net.SocketException;
    import android.app.Activity;
    import android.app.AlertDialog;
    import android.content.DialogInterface;
    import android.os.Bundle;
    import android.widget.TextView;
    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 TestApp extends Activity {

private static final String SOAP_ACTION = "http://tempuri.org/getData";

    private static final String METHOD_NAME = "getData";

    private static final String NAMESPACE = "http://tempuri.org/";
    private static final String URL = "http://10.0.2.2/login2/Service1.asmx";
    TextView tv;

boolean[] bln1=null;

    @Override
    public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    tv=(TextView)findViewById(R.id.text1);


    String[] arr2= call();
    boolean[] bln = {false, false, false};

     bln1 = new boolean[arr2.length];


    new AlertDialog.Builder(TestApp.this)
    .setIcon(R.drawable.alert_dialog_icon)
    .setTitle("Title")
    .setMultiChoiceItems(arr2,
            bln,
            new DialogInterface.OnMultiChoiceClickListener() {
                public void onClick(DialogInterface dialog, int whichButton,
                        boolean isChecked) {


                    if(isChecked){
                        bln1[whichButton] = true;
                    }
                    else{
                        bln1[whichButton] = false;
                    }
                }
            })
      .setPositiveButton("Ok", new DialogInterface.OnClickListener() {
        public void onClick(DialogInterface dialog, int whichButton) {


        }
      })
      .setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
        public void onClick(DialogInterface dialog, int whichButton) {


        }
      })
     .show();


      }


      public String[] call()
     {
    SoapPrimitive responsesData = null; 

    SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME); 

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

    HttpTransportSE androidHttpTransport = new HttpTransportSE(URL);

    androidHttpTransport.debug = true; 

    try {

    androidHttpTransport.call(SOAP_ACTION, envelope);

    responsesData = (SoapPrimitive) envelope.getResponse(); 
    System.out.println(" --- response ---- " + responsesData); 

    } catch (SocketException ex) { 
    ex.printStackTrace(); 
    } catch (Exception e) { 
    e.printStackTrace(); 
    } 
    System.out.println( " ----" + responsesData );

    String serviceResponse= responsesData .toString(); 


    String[] temp; 
    String delimiter = "#"; 
    temp= serviceResponse.split(delimiter);
    System.out.println( " ---- length ---- " + temp.length); 

    return temp; 
    }


   }

Пожалуйста, кто-нибудь может помочь мне решить мою проблему, так как каждый раз, когда я запускаю код, я получаю сообщение об ошибке «Приложение неожиданно прервано»

Спасибо

1 Ответ

1 голос
/ 01 августа 2011

Вы вызываете веб-службу в потоке пользовательского интерфейса , что означает, что поток пользовательского интерфейса заблокирован до получения ответа от веб-службы.Поскольку Android является мобильной ОС, для повышения производительности она завершает заблокированные потоки.

Попробуйте записать вызов веб-службы в Async Task .Используя задачу Async, вы можете запустить вызов веб-службы в фоновом потоке, и ваш поток пользовательского интерфейса не будет заблокирован.

Это должно решить вашу проблему.

...