android模拟器webservice,已解决:android 模拟器调用本地的webservice 引用不到
背景,需要自己用 java 写一个 webservice, 然后写一个 android的客户端去调用它。
我这里折腾了2天,最后终于调成功了。以图为证。
要点:
1, MyEclipse开发webservice
MyEclipse 建 webservice之前,先把 Tomcat 设置好: MyEclipse -> Preference -> MyEclipse -> Servers -> Tomcat -> Configure Tomcat 7.x -> 选Enable,输入Tomcat home directory,tomcat base directory 和 tomcat temp directory 会自己填好,保存
核心的代码:
public String sayHello(String name)
{
return "hello," + name;
} 因为用 Eclipse 写 webservice,需要引用到一些的包,可能因为一些未知的原因,老是不停的报错。折腾了一些时间后,果断放弃之。用MyEclipse 10 去写webservice, 一路next, 节省了不少时间。
MyEclipse建webservice主要步聚:新建一个web项目,右击之,新建 -> MyEclipse -> WebService > Project: 你的项目名; Framework: JAX-WS; Strategy: buttom-up scenario -> Next --> Java Class 选 自己新建的HelloWorld, ------- 具体的操作参考 下面别人的2篇日志:
myeclipse10创建jax-ws方式的webservice(一)http://blog.sina.com.cn/s/blog_4d91c1660100xly3.html
myeclipse10创建jax-ws方式的webservice(二) http://blog.sina.com.cn/s/blog_4d91c1660100xlyt.html
webservice弄好后,应该 可以通过URL访问;若别人的机器不能访问,则需要关闭 防火墙 或 给 8080端口开启一个例外:
2,android项目中引用 webservice, 一般用第三方的 ksoap
这里我用的是:ksoap2-android-assembly-2.5.2-jar-with-dependencies.jar
之前我用 ksoap3.0的包,可以调用到别人用.net写的webservice; 但就是调不到自己的service。现在换成低版本的,反而成功了。
3, 关于引用 ksoap2的方式,与我们在java项目中通常的引用方式不一样。
在 android项目中,将 ksoap 2.5.2的包放在 libs文件夹中,选中,右键 -> build path -> add to build path; 选中android项目,右键 -> build path -> config build path -> 在 Order and Export选项卡页面中,选中 ksoap 2.5.2的包 -> 保存
4, 读取 webservice的方法
这个方法既要能够访问 .net的webservice, 又要访问 java的webservice.
贴一下我的 ReadRemoteService.java
package com.tools;
import java.util.List;
import org.ksoap2.SoapEnvelope;
import org.ksoap2.SoapFault;
import org.ksoap2.serialization.SoapObject;
import org.ksoap2.serialization.SoapSerializationEnvelope;
import org.ksoap2.transport.HttpTransportSE;
import org.ksoap2.transport.AndroidHttpTransport;
public class ReadRemoteService {
public String NAMESPACE;
public String METHODNAME;
public String WEBSERVICEURL;
public Boolean ISDOTNETSERVICE;
public List LISTPARAMS;
public ReadRemoteService(String nameSpace,String methodName,String WebServiceUrl,Boolean IsDotNetService,List lstParams)
{
this.NAMESPACE = nameSpace;
this.METHODNAME = methodName;
this.WEBSERVICEURL=WebServiceUrl;
this.ISDOTNETSERVICE = IsDotNetService;
this.LISTPARAMS=lstParams;
}
public Object Get()
{
try {
return ReadService();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
return "ERROR:" + e.getMessage();
}
}
private Object ReadService() throws Exception {
// 命名空间
String nameSpace = this.NAMESPACE;
//"http://WebXml.com.cn/";
// 调用的方法名称
String methodName = this.METHODNAME;
//"getMobileCodeInfo";
// EndPoint
String endPoint = this.WEBSERVICEURL;
//"http://webservice.webxml.com.cn/WebServices/MobileCodeWS.asmx";
// SOAP Action
String soapAction = this.NAMESPACE + this.METHODNAME;
//"http://WebXml.com.cn/getMobileCodeInfo";
// 指定WebService的命名空间和调用的方法名
SoapObject rpc = new SoapObject(nameSpace, methodName);
// 设置需调用WebService接口需要传入的两个参数mobileCode、userId
/*rpc.addProperty("mobileCode", phoneSec);
rpc.addProperty("userId", "");*/
if(this.LISTPARAMS !=null)
{
if(this.LISTPARAMS.size() % 2 !=0 || this.LISTPARAMS.size()<2)
{
throw new Exception("params should be even!");
}
for(int i=0;i
{
//System.out.println(this.LISTPARAMS.get(i));
rpc.addProperty(this.LISTPARAMS.get(i), this.LISTPARAMS.get(i+1));
//throw new Exception("params:" + this.LISTPARAMS.get(i) + " " + this.LISTPARAMS.get(i+1));
}
}
// 生成调用WebService方法的SOAP请求信息,并指定SOAP的版本
SoapSerializationEnvelope envelope
= new SoapSerializationEnvelope(SoapEnvelope.VER11);
//(SoapEnvelope.VER10);
envelope.bodyOut = rpc;
// 设置是否调用的是dotNet开发的WebService
envelope.dotNet = this.ISDOTNETSERVICE;
envelope.encodingStyle="UTF-8";
if(!envelope.dotNet)
{
endPoint = endPoint + "?wsdl";
}
// 等价于envelope.bodyOut = rpc;
envelope.setOutputSoapObject(rpc);
try {
// 调用WebService
HttpTransportSE transport = new HttpTransportSE(endPoint);
//AndroidHttpTransport transport =new AndroidHttpTransport(endPoint);
//transport.debug=false;
/*transport.call(soapAction, envelope);*/
/*if(!envelope.dotNet)
{
transport.call(null, envelope);
}else*/
{
transport.call(soapAction,envelope);
}
} catch (Exception e) {
e.printStackTrace();
return "ERROR:" + e.getMessage();
}
// 获取返回的数据
SoapObject object=null;
SoapFault error=null;
try
{
object = (SoapObject) envelope.bodyIn;
}catch(Exception e)
{
error = (SoapFault)envelope.bodyIn;
// detail =(SoapObject) envelope.getResponse();
System.out.println("Error message : "+error.toString());
}
// 获取返回的结果
//String result = object.getProperty(0).toString();
// 将WebService返回的结果显示在TextView中
// lbl1.setText(result);
if(error!=null)
return error;
return object;
}
}
Common.java
package com.tools;
import java.util.ArrayList;
import android.widget.TextView;
public class Common {
public static void SolveRemoteService(Object ServiceResult,TextView tvResult)
{
java.util.Date now=new java.util.Date();
if(ServiceResult instanceof String)
{
tvResult.setText(now.toLocaleString() + " " + "String:" + ServiceResult.toString());
}else if(ServiceResult instanceof ArrayList)
{
StringBuilder sb=new StringBuilder();
Object[] values = ((ArrayList) ServiceResult).toArray(); //正确
for(Object x:values)
{
sb.append(x.toString() + "\r\n");
}
tvResult.setText(now.toLocaleString() + " " + "ArrayList:" +sb.toString());
}else
{
tvResult.setText(now.toLocaleString() + " " + "Other types:" + ServiceResult.toString());
}
}
}
5, 在android项目中调用 刚才的方法的样例
1)访问 .net的webservice 样例
String sNameSpace="http://WebXml.com.cn/";
String sMethodName="getMobileCodeInfo";
String sWebserviceUrl="http://webservice.webxml.com.cn/WebServices/MobileCodeWS.asmx";
Boolean IsDotNetService=true;
List lstParams=new ArrayList();
lstParams.add("mobileCode");
lstParams.add(sPhone);
lstParams.add("userId");
lstParams.add("");
ReadRemoteService readService=
new ReadRemoteService(sNameSpace,sMethodName,sWebserviceUrl,IsDotNetService,lstParams);
Object Result = readService.Get();
Common.SolveRemoteService(Result,tv_Result); 2) 访问 java的webService
注意:前面我在webservice中的参考名是 name, 这里却写的是 arg0, 为什么呢?因为 用MyEclipse在自动帮我生成webservice 相关的代码时,参数名已被改为 arg0.
如果 坚持写 name, 结果只有一个,返回的是:hello,null.
tv_WsResult.setText("");
String sName = et_Name.getText().toString().trim();
String sWsUrl=et_WsUrl.getText().toString().trim(); //sWsUrl应该是 http://192.168.8.***:8080/testWebService/HelloWorldPort
/*String sResult = ReadMyService(sName,sWsUrl);
java.util.Date now=new java.util.Date();
tv_WsResult.setText(now.toLocaleString() + " " + sResult);*/
String sNameSpace="http://testWebService.com/";
String sMethodName="sayHello";
String sWebserviceUrl=sWsUrl;
Boolean IsDotNetService=false;
List lstParams=new ArrayList();
lstParams.add("arg0");
lstParams.add(sName);
/* java.util.Date now=new java.util.Date();
tv_WsResult.setText(now.toLocaleString() + " " + sName); */
ReadRemoteService readService=
new ReadRemoteService(sNameSpace,sMethodName,sWebserviceUrl,IsDotNetService,lstParams);
Object Result = readService.Get();
Common.SolveRemoteService(Result,tv_WsResult);
6, 特别注意:在第5步,传参时,命名空间,方法名,WebServiceUrl都不能错。
而且java是大小写敏感的,请确保你的webservice在浏览器中首先能访问。
在模拟器上调 本机的webservice,用 本机的IP地址,不用 localhost.
7, 在android项目的AndroidManifest.xml文件中,需要配置相应可以访问网络、可以访问wifi的权限:
8,如果是真机 要调用 自己电脑 上的 webservice, 则需要关闭真机上的 wifi 和数据连接,同时 打开 设置 -> 更多 -> Internet 传输 (更过PC连接到internet)
至此,全文 结束。感谢大家。
android模拟器webservice,已解决:android 模拟器调用本地的webservice 引用不到相关推荐
- android 哪个服务提示 存储设备空间不足,请释放一些空间,[已解决]Android手机上的存储空间不足怎么办?...
第2部分:5解决方案以解决存储空间不足的错误 我的手机说存储空间不足,但我的设备上有空间.不过,我一直在手机上"存储空间不足".过了一段时间,当我意识到我无法管理设备的内部存储时. ...
- pycharm里有android虚拟设备吗,已解决!PyCharm打开一直出现Reloading generated skeletons问题...
已解决!PyCharm打开一直出现Reloading generated skeletons问题 数据科学深度学习的同僚们对PyCharm真的是再熟悉不过了...虽然pycharm占用内存非常大,加载 ...
- android 工作空间不足,如何解决Android Studio的磁盘空间不足?
如何解决Android Studio的磁盘空间不足? 我随机收到此错误,不确定为什么Android Studio的磁盘空间不足. Android Studio系统目录分区上的磁盘空间不足 更新资料 此 ...
- flutter打开android界面,在已有Android项目中使用Flutter
实现效果,在已存在的android项目中接入flutter,即android调用开启flutter页面(使用android打开flutter的指定页面),flutter调用原生android方法 步骤 ...
- android studio 安装问题,解决Android Studio的安装问题
今天开始了android studio的下载与安装,我再官网上下载了Android studio,下载不难,运行出来可需要一定的时间,在中途中我遇到了一些问题 一:Build错误: 在我最开始下载完A ...
- android背景图拉伸,解决android:background背景图片被拉伸问题
解决android:background背景图片被拉伸问题 ImageView中XML属性src和background的区别: background会根据ImageView组件给定的长宽进行拉伸,而s ...
- android studio crashlytics,完美解决Android Studio集成crashlytics后无法编译的问题
问题描述: 在用fabric集成后编译出现如下错误, Error:Cause: hostname in certificate didn't match: != OR OR build.gradle部 ...
- android apt最新版本,解决Android studio 2.3升级到Android studio 3.0 后apt报错问题
解决Android studio 2.3升级到Android studio 3.0 后apt报错问题 发布时间:2020-09-16 19:59:42 来源:脚本之家 阅读:62 作者:哈特中尉 1. ...
- android xml 预览,解决Android studio xml界面无法预览问题
解决Android studio xml界面无法预览问题 发布时间:2020-10-05 18:48:37 来源:脚本之家 阅读:140 作者:张雨明 如下图 修改style.xml中的 parent ...
- android按钮被遮住,解决Android 虚拟按键遮住了页面内容的问题
在启动页的时候华为手机虚拟按键遮挡住了启动页下面的字找了找解决办法,特地记录一下 第一种办法:扩展虚拟按键 //状态栏 @ 顶部getWindow().addFlags(WindowManager.L ...
最新文章
- oracle启用归档日志
- w命令、vmstat命令、top命令、sar命令、noload命令
- 小学校园里计算机文字,中小学计算机教学论文(共2228字).doc
- 反向传播神经网络 BPNN
- 前端网页 — 初始化文件
- SingnalR 开发到生产部署闭坑指南
- 【ES9(2018)】Object Rest Spread
- Java对象运行时在内存中的情况
- cdn.cache.php,CDN缓存不命中诊断 - 在线工具
- go语言 goquery爬虫
- win11游戏窗口化如何设置 windows11游戏窗口化的设置方法
- 如何查看浏览器的 cookie
- DC影视作品及观看顺序
- 前端开发工程师就业时应该选择大公司还是小公司?这是我听过最靠谱的答案!
- 使用awk 统计分析游戏后台日志中的数据
- 从目标检测到小目标检测
- 计算相似度的LLR算法
- 别翻了,这篇文章就是要让你入门java多线程!
- 2020年金属非金属矿山(露天矿山)主要负责人考试报名及金属非金属矿山(露天矿山)主要负责人考试资料
- 团队管理4 | 技术管理如何兼顾技术