Java Android上的KSoap2冻结设备,而不是进行Web服务调用
我正在尝试连接到我为接收来自Android设备的SOAP调用而创建的.NET 4.0Web服务,为了测试目的,该服务现在托管在本地IIS上 我发现ksoap2对于我想做的事情来说是一个非常好的类库。从下载了.jar包并开始狂喜地敲击键盘。。。用我的手指 发送的信息量从几KB到几MB不等 什么在起作用Java Android上的KSoap2冻结设备,而不是进行Web服务调用,java,android,ksoap2,android-ksoap2,Java,Android,Ksoap2,Android Ksoap2,我正在尝试连接到我为接收来自Android设备的SOAP调用而创建的.NET 4.0Web服务,为了测试目的,该服务现在托管在本地IIS上 我发现ksoap2对于我想做的事情来说是一个非常好的类库。从下载了.jar包并开始狂喜地敲击键盘。。。用我的手指 发送的信息量从几KB到几MB不等 什么在起作用 HttpTransportSE.call(String,SoapSerializationEnvelope)-方法在Eclipse的Android emulator中运行良好,将调用发送到本地IIS
HttpTransportSE.call(String,SoapSerializationEnvelope)
-方法在Eclipse的Android emulator中运行良好,将调用发送到本地IIS中托管的webservice。甚至还测试了webservice从同一局域网中的web浏览器打开服务地址时收到的空呼叫
什么不起作用
当我将.apk文件复制到Android设备上,安装它,启动它并尝试拨打电话时,整个程序在没有拨打电话的情况下冻结
从显示的代码块中可以看出,在考虑了可能的错误之后,出现了一些行:在模拟环境中,成功的调用会返回SoapPrimitive对象,或流入正确的catch块,根据当前情况为用户生成错误消息
然后,在实时Android设备上,程序将永远失去响应,必须从应用程序菜单中终止
我试过什么
我从异步方法中删除了调用,并尝试直接从为按钮单击事件指定的匿名内部函数调用它
试着不想得到回应,只是打电话
尝试获取设备的logcat程序以查看UI后面发生了什么,发现两个,他们需要根访问权限,而我在设备中没有。这就是为什么我没有任何logcat向您展示的原因,而展示模拟器logcat可能是无用的,因为它在那里工作得很好
未尝试连接到本地主机
尝试在运行安卓4.2.2的旧款联想平板电脑和全新的三星Galaxy Tab上安装该程序时,两者都会遇到同样的问题,否则效果会很好
代码
下面是在设备/模拟器中进行调用的异步方法,其中变量str_URL
和soapRequest
分别是正确的服务地址(选中)和格式良好的SoapObject:
@Override
protected WebServiceResult doInBackground(Void... v) {
WebServiceResult _ret;
SoapSerializationEnvelope soapEnvelope= new SoapSerializationEnvelope(SoapEnvelope.VER11);
soapEnvelope.dotNet=true;
soapEnvelope.setAddAdornments(false);
soapEnvelope.setOutputSoapObject(soapRequest);
HttpTransportSE conn = new HttpTransportSE(str_URL);
conn.setXmlVersionTag("<?xml version=\"1.0\" encoding=\"utf-8\"?>");
conn.debug = true;
try {
conn.call(str_ACTION, soapEnvelope);
SoapObject o = (SoapObject)soapEnvelope.getResponse();
_ret = new WebServiceResult(o, WebServiceResultEnum.ok);
} catch (NetworkOnMainThreadException e) {
_ret = new WebServiceResult(null, WebServiceResultEnum.keskeytys);
} catch (HttpResponseException e) {
_ret = new WebServiceResult(null, WebServiceResultEnum.httpVirhe);
} catch (XmlPullParserException e) {
_ret = new WebServiceResult(null, WebServiceResultEnum.vaara_muoto);
} catch (SocketTimeoutException e) {
_ret = new WebServiceResult(null, WebServiceResultEnum.aikakatkaisu);
} catch (Exception e) {
_ret = new WebServiceResult(null, WebServiceResultEnum.keskeytys);
}
return _ret;
}
@覆盖
受保护的WebServiceResult doInBackground(无效…v){
WebServiceResult;
SoapSerializationEnvelope soapEnvelope=新的SoapSerializationEnvelope(soapEnvelope.VER11);
soapEnvelope.dotNet=true;
soapEnvelope.SetAddAdorments(假);
setOutputSoapObject(soapRequest);
HttpTransportSE conn=新的HttpTransportSE(str_URL);
conn.setXmlVersionTag(“”);
conn.debug=true;
试一试{
连接呼叫(str_动作,soapEnvelope);
SoapObject o=(SoapObject)soapEnvelope.getResponse();
_ret=newWebServiceResult(o,WebServiceResultEnum.ok);
}捕获(NetworkOnMainThreade异常){
_ret=newWebServiceResult(null,WebServiceResultEnum.keskeytys);
}捕获(HttpResponseException e){
_ret=newWebServiceResult(null,WebServiceResultEnum.httpVirhe);
}catch(XMLPullParseRexE){
_ret=newWebServiceResult(null,WebServiceResultEnum.vaara_muoto);
}捕获(SocketTimeoutException e){
_ret=newWebServiceResult(null,WebServiceResultEnum.aikakakatkaisu);
}捕获(例外e){
_ret=newWebServiceResult(null,WebServiceResultEnum.keskeytys);
}
返回(ret);;
}
提前谢谢你 您是否可能正在做这样的事情:
YourAsyncTask task = new YourAsyncTask();
WebServiceResult result = task.doInBackground();
YourAsyncTask task = new YourAsyncTask();
task.execute();
public class ExampleTask extends AsyncTask<Void, Void, WebServiceResult> {
public interface FinishedListener {
public void onFinished(WebServiceResult result);
}
private final FinishedListener finishedListener;
public ExampleTask(FinishedListener listener) {
this.finishedListener = listener;
}
@Override
protected WebServiceResult doInBackground(Void... params) {
WebServiceResult result = ...;
return result;
}
@Override
protected void onPostExecute(WebServiceResult result) {
super.onPostExecute(result);
if(this.finishedListener != null) {
this.finishedListener.onFinished(result);
}
}
}
ExampleTask task = new ExampleTask(new ExampleTask.FinishedListener() {
@Override
public void onFinished(WebServiceResult result) {
// This will be called if the task has finished
}
});
task.execute();
因为那是错误的,完全错误的。如果直接调用doInBackground()
,它将在同一线程中运行,而不是在新线程中运行。您需要像这样使用execute()
启动AsyncTask
:
YourAsyncTask task = new YourAsyncTask();
WebServiceResult result = task.doInBackground();
YourAsyncTask task = new YourAsyncTask();
task.execute();
public class ExampleTask extends AsyncTask<Void, Void, WebServiceResult> {
public interface FinishedListener {
public void onFinished(WebServiceResult result);
}
private final FinishedListener finishedListener;
public ExampleTask(FinishedListener listener) {
this.finishedListener = listener;
}
@Override
protected WebServiceResult doInBackground(Void... params) {
WebServiceResult result = ...;
return result;
}
@Override
protected void onPostExecute(WebServiceResult result) {
super.onPostExecute(result);
if(this.finishedListener != null) {
this.finishedListener.onFinished(result);
}
}
}
ExampleTask task = new ExampleTask(new ExampleTask.FinishedListener() {
@Override
public void onFinished(WebServiceResult result) {
// This will be called if the task has finished
}
});
task.execute();
您需要像这样实现AsyncTask
:
YourAsyncTask task = new YourAsyncTask();
WebServiceResult result = task.doInBackground();
YourAsyncTask task = new YourAsyncTask();
task.execute();
public class ExampleTask extends AsyncTask<Void, Void, WebServiceResult> {
public interface FinishedListener {
public void onFinished(WebServiceResult result);
}
private final FinishedListener finishedListener;
public ExampleTask(FinishedListener listener) {
this.finishedListener = listener;
}
@Override
protected WebServiceResult doInBackground(Void... params) {
WebServiceResult result = ...;
return result;
}
@Override
protected void onPostExecute(WebServiceResult result) {
super.onPostExecute(result);
if(this.finishedListener != null) {
this.finishedListener.onFinished(result);
}
}
}
ExampleTask task = new ExampleTask(new ExampleTask.FinishedListener() {
@Override
public void onFinished(WebServiceResult result) {
// This will be called if the task has finished
}
});
task.execute();
似乎我已经在AndroidManifest.xml中将最小SDK声明为14,将目标SDK声明为17。我没有在较新的sdk中使用任何花哨的东西,所以我将目标sdk降低到与最小sdk相同的级别,14。我也有一个前卫!我删除的平板电脑上运行的防病毒服务
这解决了我的问题。那可能是最前卫的!防病毒程序想阻止未从Play store下载的应用程序的所有通信。我不知道更改目标SDK是否真的有多大效果。不,logcat不需要root。如果您在后台执行网络操作,它不会冻结您的UI,除非您不明智地让UI线程等待后台操作或其结果。您可以在IDE中查看logcat,而不需要应用程序。感谢您提供正确使用异步方法的全面说明。这些我都不知道!但正如我在最初的帖子中所说的,我已经尝试从异步方法中删除对webservice的调用,并在UI中直接调用。我知道Android不喜欢主线程中的网络操作,这就是为什么我为它设置了一个catch块,这样我就可以查看调用是否有效。编辑:过早提交评论。继续:所以我完全按照您的指示进行了更改,但程序仍然在真实设备上冻结,并在emulator上工作。