我的应用程序可以在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
答案 0 :(得分:0)
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
{
}
}
}
答案 1 :(得分:0)
如果其他答案不起作用,请在onCreate方法中尝试此操作,
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);