A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

© 枫儿 金牌黑马   /  2013-12-2 19:58  /  5177 人查看  /  26 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 枫儿 于 2013-12-2 20:01 编辑

     相信大家在平常的开发中,对网络的操作用到HTTP协议比较多,通过我们使用Get或者Post的方法调用一个数据接口,然后服务器给我们返回JSON格式的数据,我们解析JSON数据然后展现给用户,相信很多人很喜欢服务器给我们返回JSON数据格式,因为他解析方便,也有一些JSON的解析库
     例如Google提供的GSON,阿里巴巴的FastJson,不过还是推荐大家使用FastJson来解析,我自己开发中也是用FastJson来解析,FastJson的介绍http://code.alibabatech.com/wiki/display/FastJSON/Home,不过有时候我们用到WebService接口来获取数据,  WebService是一种基于SOAP协议的远程调用标准,通过webservice可以将不同操作系统平台、不同语言、不同技术整合到一块。在Android SDK中并没有提供调用WebService的库,因此,需要使用第三方的SDK来调用WebService。PC版本的WEbservice客户端库非常丰富,例如Axis2,CXF等,但这些开发包对于Android系统过于庞大,也未必很容易移植到Android系统中。


      因此,这些开发包并不是在我们的考虑范围内。适合手机的WebService客户端的SDK有一些,比较常用的有Ksoap2,可以从http://code.google.com/p/ksoap2-android/wiki/HowToUse?tm=2进行下载,将jar包加入到libs目录下就行了,接下来带大家来调用WebService接口

        首先我们新建一个工程,取名WebServiceDemo,我们从http://www.webxml.com.cn/zh_cn/web_services.aspx来获取WebService接口,这里面有一些免费的WebService接口,我们就用里面的天气接口吧http://www.webxml.com.cn/WebServices/WeatherWebService.asmx
我们新建一个WebService的工具类,用于对WebService接口的调用,以后遇到调用WebService直接拷贝来用就行了






           我们通过调用里面的callWebService(String url, final String methodName,HashMap<String, String> properties,final WebServiceCallBack webServiceCallBack)就可以来获取我们想要的数据,现在讲解下里面的实现思路创建HttpTransportsSE对象。通过HttpTransportsSE类的构造方法可以指定WebService的WSDL文档的URL创建SoapObject对象,里面的参数分别是WebService的命名空间和调用方法名设置调用方法的参数值,如果没有参数,就不设置,有参数的话调用SoapObject对象的addProperty(String name, Object value)方法将参数加入到SoapObject对象中实例化SoapSerializationEnvelope,传入WebService的SOAP协议的版本号


       将上面的SoapObject对象通过setOutputSoapObject(Object soapObject)设置到里面,并设置是否调用的是.Net开发的WebService和是否debug等信息因为涉及到网络操作,所以我们使用了线程池来异步操作调用WebService接口,我们在线程中调用HttpTransportsSE对象的call(String soapAction, SoapEnvelope envelope)方法就能实现对WebService的调用,并且通过soapEnvelope.bodyIn获取WebService返回的信息,但是返回的信息是在子线程中,我们需要利用Handler来实现子线程与主线程进行转换,然后在Handler的handleMessage(Message msg)中将结果回调到callBack的参数中,总体思路就是这个样子,接下来我们来使用这个工具类吧我们先用一个ListView来显示所有的省份,然后点击每个省进去到市。市也用一个ListView来显示,最后点击市用TextView来显示获取的WebService天气情况,思路很简单用来显示省份的布局,里面只有一个ListView




      接下来就是Activity的代码,先用工具类调用WebService方法,然后在回调方法callBack(SoapObject result)中解析数据到一个List<String>中,在设置ListView的适配器

     点击省份进入该省份下面的市。也用一个ListView来显示市的数据,布局跟上面一样,Activity里面的代码也差不多相似,我就不过多说明了,直接看代码


      接下来就是点击相对应的城市调用WebService接口来获取该城市下面的天气详情啦,为了简单起见,我用一个TextView来显示天气信息,因为天气信息很多,一个屏幕显示不完,所以我们考虑在外面加一个ScrollView来进行滚动


      接下来就是点击相对应的城市调用WebService接口来获取该城市下面的天气详情啦,为了简单起见,我用一个TextView来显示天气信息,因为天气信息很多,一个屏幕显示不完,所以我们考虑在外面加一个ScrollView来进行滚动

到这里我们就完成了编码工作,在运行程序之前我们需要在AndroidManifest.xml注册Activity,以及添加访问网络的权限

运行结果:
      

省份,城市列表可以加上A-Z的排序功能,可以参考下Android实现ListView的A-Z字母排序和过滤搜索功能,实现汉字转成拼音,我这里就不添加了,需要添加的朋友自行实现

源码下载:回复可见
游客,如果您要查看本帖隐藏内容请回复





26 个回复

正序浏览
baby14 金牌黑马 2018-11-16 08:24:43
27#
多谢分享
回复 使用道具 举报
求一份源码
回复 使用道具 举报
学习学习
回复 使用道具 举报
FastJson的确是好东西,我开发也是用它的
回复 使用道具 举报
学习学习
回复 使用道具 举报
顶顶顶,大爱黑马!
回复 使用道具 举报
厉害啊,求分享资源,学习一下
回复 使用道具 举报
谢谢分享
回复 使用道具 举报
:)                                          
回复 使用道具 举报
学习学习
回复 使用道具 举报
很不错的学习资料,值得学习,谢谢分享.
回复 使用道具 举报
回复是一种美德,必须的
回复 使用道具 举报
ZHNET 初级黑马 2014-4-28 11:44:57
15#
dddddddddd
回复 使用道具 举报
不错,学习了
回复 使用道具 举报
kankaanaknan
回复 使用道具 举报
dddddddddddddddddddddddddddddddd
回复 使用道具 举报
谢谢分享
回复 使用道具 举报
dgdgdgdgerererer
回复 使用道具 举报

非常好的资源,谢谢分享!
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 加入黑马