【问题标题】:Android getting error Ksoap in android 4 or aboveAndroid 在 android 4 或更高版本中出现错误 Ksoap
【发布时间】:2014-09-06 06:49:03
【问题描述】:

我的应用程序可以毫无问题地在 android 2.* 中运行,并且可以正确使用 KSoap 模块。但在 Android 4 或更高版本中安装应用程序后,我收到此错误:

627-627/ir.tsms E/AndroidRuntime﹕ FATAL EXCEPTION: main
    android.os.NetworkOnMainThreadException
            at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1099)
            at java.net.InetAddress.lookupHostByName(InetAddress.java:391)
            at java.net.InetAddress.getAllByNameImpl(InetAddress.java:242)
            at java.net.InetAddress.getAllByName(InetAddress.java:220)
            at libcore.net.http.HttpConnection.<init>(HttpConnection.java:71)
            at libcore.net.http.HttpConnection.<init>(HttpConnection.java:50)
            at libcore.net.http.HttpConnection$Address.connect(HttpConnection.java:351)
            at libcore.net.http.HttpConnectionPool.get(HttpConnectionPool.java:86)
            at libcore.net.http.HttpConnection.connect(HttpConnection.java:128)
            at libcore.net.http.HttpEngine.openSocketConnection(HttpEngine.java:308)
            at libcore.net.http.HttpEngine.connect(HttpEngine.java:303)
            at libcore.net.http.HttpEngine.sendSocketRequest(HttpEngine.java:282)
            at libcore.net.http.HttpEngine.sendRequest(HttpEngine.java:232)
            at libcore.net.http.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:80)
            at org.ksoap2.transport.ServiceConnectionSE.connect(ServiceConnectionSE.java:46)
            at org.ksoap2.transport.HttpTransportSE.call(HttpTransportSE.java:68)
            at ir.tsms.wsdl.WSDLHelper.call(WSDLHelper.java:34)
            at ir.tsms.wsdl.TSMS.checkUserAuth(TSMS.java:64)

我的WSDLHEPLER 是:

public class WSDLHelper {
    public static String call(SoapObject request) throws TException {
        String result;

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

        AndroidHttpTransport transport = new AndroidHttpTransport(Strings.URL_TSMS);
        transport.debug = true;

        try {

            /*  GETTING ERROR IN BELOW LINE  */
            transport.call(Strings.URL_TSMS + request.getName(), envelope);
            result = envelope.getResponse().toString();
        } catch (IOException ex) {
            Log.e("" , ex.getMessage());
            throw new TException(PublicErrorList.NOT_EXIST_ERROR_DETAIL);
        } catch (XmlPullParserException ex) {
            Log.e("" , ex.getMessage());
            throw new TException(PublicErrorList.NOT_EXIST_ERROR_DETAIL);
        }
        if (result.equals(String.valueOf(Integers.CODE_USER_PASS_FALSE)))
            throw new TException(PublicErrorList.USERNAME_PASSWORD_ERROR);

        return result;
    }

    public static String convert1(String str) {
        return str.substring(1, str.length() - 1);
    }

    public static String[] convert2(String str) {
        return str.split(", ");
    }

    public static String[] convert3(String str) {
        return str.split(",");
    }

}

在 android 2.2,3,3.* 中测试后没有问题。我不知道为什么这个模块不能在 android 4 中运行。请帮助我。谢谢

我的Ksoap 是:

ksoap2-android-assembly-2.4-jar-with-dependencies.jar

【问题讨论】:

    标签: android ksoap2 android-ksoap2 ksoap


    【解决方案1】:

    如果其他答案不起作用,请在您的 onCreate 方法中尝试此操作,

        StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
        StrictMode.setThreadPolicy(policy);
    

    【讨论】:

      【解决方案2】:

      LogCat 告诉你出了什么问题:

      FATAL EXCEPTION: main
      android.os.NetworkOnMainThreadException
      

      您在 MainThread 上联网,在 Android 3.0 及更高版本中,您必须在后台线程上进行联网。

      编辑:这只是一个例子,它可能包含错误!

      public class WSDLHelper  extends AsyncTask<String, String, String>{
      
      private static String SOAP_ACTION = "http://tempuri.org/***";
      //private static String SOAP_ACTION = "http://tempuri.org/***";
      private static String NAMESPACE = "http://tempuri.org/";
      private static String METHOD_NAME = "yourMethodName";
      private String Url;
      
      private Context context;
      
      public WSDLHelper()
      {
      
      }
      
      public WSDLHelper(Context context)
      {
          this.context = context;
      }
      
      
      @Override
      public void onProgressUpdate(String... data)
      {
      }
      
      @Override
      protected String doInBackground(String... uri) 
      {
              publishProgress("prepare sending");
              SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);     
      
      
              request.addProperty("YourKey",Key);
      
              SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
      
              new MarshalDate().register(envelope);
      
              envelope.setOutputSoapObject(request);
              envelope.dotNet = true;
              envelope.implicitTypes= false;
      
              try {
                  HttpTransportSE androidHttpTransport = new HttpTransportSE(url);
                  androidHttpTransport.call(SOAP_ACTION, envelope);
                  // Get the SoapResult from the envelope body.
                  SoapObject result = (SoapObject)envelope.bodyIn;
                  String Test = result.toString();
                  String Test1 = result.getProperty(0).toString();
                  publishProgress("data accepted - " + result.getProperty(0).toString());
                  return result.getProperty(0).toString();
      
      
                  } 
              catch (Exception e) {
                  return null;
                  }
      
      }
      
      @Override
      protected void onPostExecute(String result) {
      
          super.onPostExecute(result);
      
          if("OK".equals(result) )
          {
              // Do What you Want
          }
          else
          {
          }
      }
      

      }

      【讨论】:

      • 嗨。我在 app.or 上没有任何网络。或任何操作 sush 为Thread 我只检查网络访问互联网。你到底是什么意思?将ksoap 移动到Thread
      • @MahdiPishguy :您正在使用 Ksoap 网络服务并向服务器发出请求,因此您正在联网。您应该在另一个线程上执行此操作或使用 AsyncTask。
      • 您能帮我了解如何使用 AsyncTask 吗?我的主要要求并使用 Ksoap 粘贴在帖子上。谢谢
      猜你喜欢
      • 2012-12-19
      • 1970-01-01
      • 2014-04-26
      • 2015-11-07
      • 1970-01-01
      • 1970-01-01
      • 2014-04-26
      • 1970-01-01
      • 2019-12-19
      相关资源
      最近更新 更多