Как вызвать веб-сервис из проекта Android Studio - PullRequest
0 голосов
/ 27 мая 2020

Я новичок в Android и Java, так что извините за незнание. Взять это время во время карантина и попытаться получить ответ веб-службе, в которой я написал. NET Это простая служба. Передайте идентификатор пользователя и пароль, и он вернет фамилию пользователя, если он найден, или НЕТ, если не найден. У меня есть программа VB 2017, которая работает должным образом, но пытается также получить те же результаты в среде Android.

Вот мой импорт.

import java.io.IOException;
import java.net.SocketException;
import org.ksoap2.SoapEnvelope;
import org.ksoap2.SoapFault;
import org.ksoap2.serialization.PropertyInfo;
import org.ksoap2.serialization.SoapObject;
import org.ksoap2.serialization.SoapPrimitive;
import org.ksoap2.serialization.SoapSerializationEnvelope;
import org.ksoap2.transport.HttpTransportSE;
import org.xmlpull.v1.XmlPullParserException;

При нажатии кнопки У меня есть следующее.

{
  String userID = "Tom";
  String pwd = "&yhe$43*";

  userid = new PropertyInfo();
  password = new PropertyInfo();

  SoapObject request = new SoapObject("http://tempuri.org/", "WebService1");

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

  userid.setName("userID");
  userid.setValue(userID);
  userid.setType(String.class);
  password.setName("password");
  password.setValue("Yo");
  password.setType(String.class);

  request.addProperty(userid);
  request.addProperty(password);
  try {
    httpTransport.call(SOAP_ACTION, envelope);
    SoapPrimitive response = (SoapPrimitive) envelope.getResponse();
    String resp = response.toString();
    Toast.makeText(MainActivity.this, (CharSequence) resp, Toast.LENGTH_LONG).show();
  } catch (Exception e) {
    Toast.makeText(MainActivity.this, (CharSequence) e, Toast.LENGTH_LONG).show();
  }
}

Ошибка в этой строке:

httpTransport.call(SOAP_ACTION, envelope); 

Похоже, он получает

java.lang.reflect.InvocationTargetException

Что-то явно не так Вот. Я мог бы воспользоваться некоторыми рекомендациями.

Вот данные Logcat:

java.lang.IllegalStateException: Could not execute method for android:onClick
    at androidx.appcompat.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:402)
    at android.view.View.performClick(View.java:6294)
    at android.view.View$PerformClick.run(View.java:24770)
    at android.os.Handler.handleCallback(Handler.java:790)
    at android.os.Handler.dispatchMessage(Handler.java:99)
    at android.os.Looper.loop(Looper.java:164)
    at android.app.ActivityThread.main(ActivityThread.java:6494)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)
Caused by: java.lang.reflect.InvocationTargetException
    at java.lang.reflect.Method.invoke(Native Method)
    at androidx.appcompat.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:397)
    at android.view.View.performClick(View.java:6294) 
    at android.view.View$PerformClick.run(View.java:24770) 
    at android.os.Handler.handleCallback(Handler.java:790) 
    at android.os.Handler.dispatchMessage(Handler.java:99) 
    at android.os.Looper.loop(Looper.java:164) 
    at android.app.ActivityThread.main(ActivityThread.java:6494) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)
Caused by: java.lang.ClassCastException: android.os.NetworkOnMainThreadException cannot be cast to java.lang.CharSequence
    at com.example.myapplication.MainActivity.getName(MainActivity.java:71)
    at java.lang.reflect.Method.invoke(Native Method) 
    at androidx.appcompat.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:397) 
    at android.view.View.performClick(View.java:6294) 
    at android.view.View$PerformClick.run(View.java:24770) 
    at android.os.Handler.handleCallback(Handler.java:790) 
    at android.os.Handler.dispatchMessage(Handler.java:99) 
    at android.os.Looper.loop(Looper.java:164) 
    at android.app.ActivityThread.main(ActivityThread.java:6494) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)

Ответы [ 2 ]

0 голосов
/ 28 мая 2020
android.os.NetworkOnMainThreadException 

Из журнала ошибок, который вы опубликовали, я вижу, что вы выполняете сетевую задачу в основном потоке android.

это исключение возникает, когда вы выполняете сетевую операцию в основном потоке. пожалуйста, запланируйте эту задачу в фоновом потоке.

Для справки я включил ссылку, описывающую, как решить эту Как исправить 'android .os.NetworkOnMainThreadException'?

А также измените это

Toast.makeText(MainActivity.this, (CharSequence) e, Toast.LENGTH_LONG).show();

на

Toast.makeText(MainActivity.this, e.getMessage(), Toast.LENGTH_LONG).show();

наконец, убедитесь, что вы добавили разрешение Inte rnet в файл манифеста.

Удачного кодирования !!

0 голосов
/ 27 мая 2020

Проблема в этой строке, я бы предположил:

       Toast.makeText(MainActivity.this, (CharSequence) e, Toast.LENGTH_LONG).show();

Вы приводите e (типа «Exception») к CharSequence, что, очевидно, незаконно, поскольку класс не может наследовать из Exception и CharSequence.

Попробуйте использовать «e.getMessage ()» вместо «(CharSequence) e». Это не исправит фактическую причину исключения, но, по крайней мере, вы сможете увидеть, что это за фактическое исключение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...