Android-带有Android.os.NetworkOnMainThreadException错误的Webservice客户端
我的目标是从Android设备调用.NETWebService(.asmx) .Net Webservice使用.Net测试客户端和SOAPUI应用程序进行测试 我正在使用Eclipse为webservice调用构建包含android应用程序的KSOAP2项目。应用程序有Android-带有Android.os.NetworkOnMainThreadException错误的Webservice客户端,android,webservice-client,Android,Webservice Client,我的目标是从Android设备调用.NETWebService(.asmx) .Net Webservice使用.Net测试客户端和SOAPUI应用程序进行测试 我正在使用Eclipse为webservice调用构建包含android应用程序的KSOAP2项目。应用程序有android.permission。互联网标签包含在用户权限部分 我有两个问题 [1] 如果我从onCreate()(下面的代码)调用webservice方法,应用程序将抛出“android.os.NetworkOnMainT
android.permission。互联网标签包含在用户权限部分
我有两个问题
[1] 如果我从onCreate()
(下面的代码)调用webservice方法,应用程序将抛出“android.os.NetworkOnMainThreadException”错误(我在internet上看到的许多示例都采用相同的方法,但我不知道为什么它在我的项目中失败)
[2] 为了解决上述问题,我在“MainActivity”中创建了一个类,但现在我在client.execute(“一些文本作为输入”)行上收到了“sourcenotfound”消息
(已检查构建路径,存在对KSOAP2 jar文件的引用,并且没有编译错误)
正确的方法是什么?如何解决这个问题?谢谢你的帮助
代码[第1期]
//This code for calling .net webservice from Android devide.. and throws "android.os.NetworkOnMainThreadException" whilst calling.
package com.example.wsclient;
import org.ksoap2.SoapEnvelope;
import org.ksoap2.serialization.SoapObject;
import org.ksoap2.serialization.SoapSerializationEnvelope;
import org.ksoap2.transport.HttpTransportSE;
import android.os.Bundle;
import android.app.Activity;
import android.app.AlertDialog;
import android.view.Menu;
import android.widget.TextView;
public class MainActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
String SOAP_ACTION = "http://mycomp.org/GetParticipantVote";
String METHOD_NAME = "GetParticipantVote";
String NAMESPACE = "http://mycomp.org/";
String URL = "http://10.0.2.2:8080/WSRating.asmx";
try {
SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);
request.addProperty("sID", "My_name");
request.addProperty("sRate", "9");
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
envelope.dotNet=true;
envelope.setOutputSoapObject(request);
HttpTransportSE androidHttpTransport = new HttpTransportSE (URL);
androidHttpTransport.call(SOAP_ACTION, envelope);
SoapObject result=(SoapObject)envelope.getResponse();
//To get the data.
String resultData=result.getProperty(0).toString();
AlertDialog alertDialog = new AlertDialog.Builder(this).create();
alertDialog.setTitle("Webservice Client");
alertDialog.setMessage("Webservice Resp : " + resultData);
alertDialog.show();
}
catch (Exception eE) {
AlertDialog alertDialog1 = new AlertDialog.Builder(this).create();
alertDialog1.setTitle("Webservice Client");
alertDialog1.setMessage("Error : " + eE.getMessage());
alertDialog1.show();
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
}
第二期的代码--
package com.example.wsclient;
import org.ksoap2.SoapEnvelope;
import org.ksoap2.serialization.SoapObject;
import org.ksoap2.serialization.SoapSerializationEnvelope;
import org.ksoap2.transport.HttpTransportSE;
import android.os.Bundle;
import android.app.Activity;
import android.app.AlertDialog;
import android.view.Menu;
import android.widget.TextView;
public class MainActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
CallWS client = new CallWS();
client.execute("some text as input");
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
/* AsyncTask class to remove android.os.NetworkOnMainThreadException error */
private class CallWS extends AsyncTask<String, Integer, String> {
protected String doInBackground(String... sValues) {
String resultData;
String SOAP_ACTION = "http://mycomp.org/GetParticipantVote";
String METHOD_NAME = "GetParticipantVote";
String NAMESPACE = "http://mycomp.org/";
String URL = "http://10.0.2.2:8080/WSRating.asmx";
try {
SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);
request.addProperty("sID", "My_name");
request.addProperty("sRate", "9");
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
envelope.dotNet=true;
envelope.setOutputSoapObject(request);
HttpTransportSE androidHttpTransport = new HttpTransportSE (URL);
androidHttpTransport.call(SOAP_ACTION, envelope);
SoapObject result=(SoapObject)envelope.getResponse();
//To get the data.
resultData =result.getProperty(0).toString();
}
catch (Exception eE) {
resultData = "Error : " + eE.getMessage();
}
return resultData
}
protected void onProgressUpdate(Integer... values) {
}
protected void onPostExecute(String result) {
// do something here to display the result...
}
}
}
package com.example.wsclient;
导入org.ksoap2.SoapEnvelope;
导入org.ksoap2.serialization.SoapObject;
导入org.ksoap2.serialization.SoapSerializationEnvelope;
导入org.ksoap2.transport.HttpTransportSE;
导入android.os.Bundle;
导入android.app.Activity;
导入android.app.AlertDialog;
导入android.view.Menu;
导入android.widget.TextView;
公共类MainActivity扩展了活动{
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
CallWS client=newcallws();
执行(“一些文本作为输入”);
}
@凌驾
公共布尔onCreateOptions菜单(菜单){
getMenuInflater().充气(R.menu.activity\u主菜单);
返回true;
}
/*AsyncTask类删除android.os.NetworkOnMainThreadException错误*/
私有类CallWS扩展了异步任务{
受保护的字符串doInBackground(字符串…s值){
字符串结果数据;
字符串SOAP_ACTION=”http://mycomp.org/GetParticipantVote";
字符串方法\u NAME=“GetParticipantVote”;
字符串命名空间=”http://mycomp.org/";
字符串URL=”http://10.0.2.2:8080/WSRating.asmx";
试一试{
SoapObject请求=新的SoapObject(名称空间、方法名称);
addProperty(“sID”、“我的名字”);
请求。添加属性(“sRate”、“9”);
SoapSerializationEnvelope=新的SoapSerializationEnvelope(SoapEnvelope.VER11);
envelope.dotNet=true;
envelope.setOutputSoapObject(请求);
HttpTransportSE androidHttpTransport=新的HttpTransportSE(URL);
调用(SOAP_操作,信封);
SoapObject结果=(SoapObject)envelope.getResponse();
//获取数据。
resultData=result.getProperty(0.toString();
}
捕获(异常eE){
resultData=“Error:+eE.getMessage();
}
返回结果数据
}
受保护的void onProgressUpdate(整型…值){
}
受保护的void onPostExecute(字符串结果){
//在此处执行某些操作以显示结果。。。
}
}
}
我的猜测是您正在IC上测试此解决方案
您可以为快速测试目的使用Strick模式:
在ICS中,用户界面上的所有网络操作都是禁止的,这就是为什么您需要重建它以使用异步任务。您不能在主线程上执行网络操作。结帐
只需使用以下代码覆盖
StrictMode.ThreadPolicy policy=新建StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(策略)
并且还使用。。。
对于使用AsyncTask的第一个问题,您已经找到了正确的解决方案。对于第二个问题,请发布出现在LogCat窗口中的stacktrace这里是LogCat-没有错误。(在调试上面的代码[2]时,我面临着“找不到源代码”-但如果只是“运行”,它可以正常工作-但调试时需要它。)这意味着,调试信息不适用于KSAOP项目吗?我已经包括了21:22:35.005:i/System.out(619):发送等待块10-03 21:22:35.015:i/dalvikvm(619):调试器处于活动状态10-03 21:22:35.135:I/System.out(619):调试器已连接10-03 21:22:35.135:I/System.out(619):等待调试器解决。。。10-03 21:22:35.345:I/System.out(619):等待调试器解决。。。10-03 21:22:37.575:I/System.out(619):等待调试器解决。。。10-03 21:22:38.385:I/System.out(619):调试器已解决(1330)
当您看到“未找到源”页面时是否终止调试?只需继续按F8(恢复),直到程序终止。这应该会在LogCat中为您提供stacktrace。