【发布时间】:2014-07-29 14:33:41
【问题描述】:
我正在尝试连接到 .NET 4.0 网络服务,该网络服务是为了从 Android 设备接收 SOAP 调用而创建的,现在托管在 本地 IIS 上用于测试目的。
我发现 ksoap2 将是一个出色的类库,可以做我想做的事。从https://code.google.com/p/ksoap2-android/ 下载了.jar 包,然后开始狂喜地敲击键盘……用我的手指。
发送的信息量从几千字节到几兆字节不等。
什么工作
HttpTransportSE.call(String, SoapSerializationEnvelope)-method 仍然在 Eclipse 的 Android 模拟器中完美运行,将调用发送到托管在本地 IIS 中的 web 服务。甚至测试了该网络服务在尝试从同一局域网中的网络浏览器打开服务地址时收到空调用。
什么不起作用
当我将 .apk 文件复制到 Android 设备、安装、启动它并尝试拨打电话时,整个程序冻结而不拨打电话。
从代码块中可以看出,在考虑了可能的错误之后出现了一些行:在模拟环境中,成功的调用返回一个 SoapPrimitive 对象或流入正确的 catch 块 根据当前情况为用户生成错误消息。
然后在实时 Android 设备上,程序永远失去响应性,必须从应用程序菜单中终止。
我尝试了什么
我从异步方法中删除了调用,并尝试直接从分配给按钮单击事件的匿名内部函数调用它。
尝试不尝试获得响应,只是拨打电话。
尝试为设备获取一个 logcat 程序以查看 UI 背后发生了什么,找到了两个,他们需要 root 访问权限,而我在设备中没有。这就是为什么我没有任何 logcat 可以显示给你,并且显示模拟器 logcat 可能(?)是无用的,因为它在那里工作正常。
没有尝试连接到本地主机。
尝试在运行 Android 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;
}
提前谢谢你!
【问题讨论】:
-
不,logcat 不需要需要root。如果您在后台执行网络操作,它不会冻结您的 UI,除非您不明智地让您的 UI 线程等待后台操作或其结果。
-
您可以在 IDE 中查看 logcat,您不需要应用程序。
标签: java android ksoap2 android-ksoap2