Ошибка при вызове веб-сервиса из класса Android - PullRequest
0 голосов
/ 30 декабря 2011

Я написал класс в Android, который будет использовать веб-сервис для чтения некоторых данных из веб-сервиса.

Когда я получаю доступ к этому веб-сервису через URL-вызов, получаю этот XML-ответ правильно.Я развернул веб-сервис на моем локальном сервере, и мой URL-адрес выглядит как http://localhost:8083/TestWebService/services/GetDatabaseRecords?wsdl.

Ниже приведен фрагмент кода, который используется для использования веб-сервиса в моем приложении.

private String METHOD_NAME = "getSupplierDetails"; // our webservice method name
private String NAMESPACE = "http://test.webservice.com/"; // Here package name in webservice with reverse order.
private String SOAP_ACTION = NAMESPACE + METHOD_NAME; // NAMESPACE + method name
private static final String URL = "http://my-machine-ip:8083/TestWebService/services/GetDatabaseRecords?wsdl";

        SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);
        SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);

        envelope.setOutputSoapObject(request);
        HttpTransportSE androidHttpTransport = new HttpTransportSE(URL);
        androidHttpTransport.debug = true;
        androidHttpTransport.call(SOAP_ACTION,envelope);
        SoapObject so = (SoapObject)envelope.bodyIn;

Подписанвозникает исключение при запуске приложения.

android.os.NetworkOnMainThreadException:null

Что-то не так с моим кодом?Эксперты, пожалуйста, помогите.

Ответы [ 2 ]

2 голосов
/ 30 декабря 2011

Как предполагает исключение, вы пытаетесь использовать сеть (т.е. потенциально медленный, блокирующий ресурс) из основного потока (пользовательского интерфейса).Android не позволяет вам этого делать - вам нужно подключиться к сети в отдельном потоке, чтобы пользовательский интерфейс реагировал.

Подробнее см. Руководство «Проектирование для отзывчивости» .

0 голосов
/ 20 марта 2015

Вы должны использовать фоновый поток для таких задач в Android.Откровенно говоря, Android предоставляет тип AsyncTask, который именно для того, что вы пытаетесь сделать.Примерно так:

private class WebserviceTask extends AsyncTask<String, Void, Object> {
 protected void doInBackground(String... parameters) {
     //do web service things here
     return result; //This is the parameter of onPostExecute, change type accordingly
 }

 protected void onPostExecute(Object result) {
     //do something with the result
 }
}

Использование:

WebserviceTask  task = new WebserviceTask();
task.execute("http://www.example.com/api"); //You can pass the parameters like this

Не забудьте также добавить строку

<uses-permission android:name="android.permission.INTERNET" /> 

в манифест.

Надеюсь, это поможет

...