Android实现KSOAP2访问WebService

开发工具:Andorid Studio 1.3

运行环境:Android 4.4 KitKat

代码实现

写一个工具类来给主界面使用,作用是使用Ksoap访问特定的网站服务,获取返回的验证码图片字节码,发送Message给主界面

public class DownLoad implements Runnable {
private final String NAMESPACE = "http://WebXml.com.cn/";
private final String METHODNAME = "enValidateByte";
private final String SOAPACTION = "http://WebXml.com.cn/enValidateByte";
private final String URL = "http://webservice.webxml.com.cn/WebServices/ValidateCodeWebService.asmx"; @Override
public void run() {
try {
SoapObject request = new SoapObject(NAMESPACE, METHODNAME);
Log.d("myDebug_str", MainActivity.str);
request.addProperty("byString", MainActivity.str);
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER10);
envelope.dotNet = true;
envelope.setOutputSoapObject(request);
HttpTransportSE transportSE = new HttpTransportSE(URL);
try {
transportSE.call(SOAPACTION, envelope);
} catch (Exception e) {
Log.d("myDebug_call", "failed to call SOAPACTION");
e.printStackTrace();
}
Log.d("myDebug_fault", envelope.bodyIn.toString());
SoapObject result = (SoapObject) envelope.bodyIn;
SoapPrimitive detail = (SoapPrimitive) result.getProperty("enValidateByteResult");
Message msg = new Message();
msg.what = MainActivity.GET_CODE;
msg.obj = detail.toString();
MainActivity.handler.sendMessage(msg);
Log.d("myDebug_sendMsg", "Send Msg successfully..");
} catch (Exception e) {
Message msg = new Message();
msg.what = MainActivity.ERROR_CODE;
MainActivity.handler.sendMessage(msg);
e.printStackTrace();
Log.d("myDebug", "Fail to finish the Progressing..");
}
}
}

这里需要注意的是,Http请求的时候没有设定超时时间,是根据默认值来设定的。整个流程中用了try语句捕捉异常,主要异常在于超时返回内容为空,可以手动捕捉该异常返回Message为异常给主界面。

主界面中点击Create的Button的时候,打开显示图片的boolean值的成员变量,说明用户等待接收验证码。点击Button后提高用户体验为在程序中控制关闭输入法的弹出。如果用户输入空值,提示用户输入内容。用ProgressDialog显示等待,该等待可取消,取消后返回的验证码也不显示

Button btnCreate = (Button)this.findViewById(R.id.btnCreate);
btnCreate.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
if (imm.isActive()) {
imm.hideSoftInputFromWindow(MainActivity.this.getCurrentFocus().getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
}
if (!edtStr.getText().toString().isEmpty()) {
toShowPic = true;
MainActivity.str = edtStr.getText().toString();
progressDialog = ProgressDialog.show(MainActivity.this, "Requesting", "Requesting...", true, true);
progressDialog.setOnCancelListener(progressDialogCancelListener);
workThread = new Thread(new DownLoad());
workThread.start();
} else {
imageView.setVisibility(View.GONE);
Toast.makeText(MainActivity.this, "请输入验证码字符!", Toast.LENGTH_SHORT).show();
}
}
}); public static DialogInterface.OnCancelListener progressDialogCancelListener = new DialogInterface.OnCancelListener() {
@Override
public void onCancel(DialogInterface dialogInterface) {
toShowPic = false;
}
};

接着就是用Handler捕获消息,作出相应的处理。因为返回的内容是字节码,需要解码生成一个Bitmap图像。由于图像的大小不一,通过作变换矩阵Matrix拉伸或缩小到设备宽度,填充到ImageView中,使得用户体验提升

public static final int GET_CODE = 0;
public static final int ERROR_CODE = 1;
public static Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case GET_CODE:
if (toShowPic) {
progressDialog.cancel();
byte[] data = Base64.decode((msg.obj.toString()).getBytes(), Base64.DEFAULT);
Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0, data.length);
Matrix matrix = new Matrix();
float scale = (float) linearLayout.getWidth() / (float) bitmap.getWidth();
Log.d("myDebug", "scale = " + scale);
matrix.postScale(scale, scale);
Bitmap resizeBitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true);
imageView.setImageBitmap(resizeBitmap);
imageView.setVisibility(View.VISIBLE);
}
break;
case ERROR_CODE:
if (toShowPic) {
progressDialog.cancel();
Toast.makeText(mContext, "获取验证码超时", Toast.LENGTH_SHORT).show();
}
break;
default:
super.handleMessage(msg);
break;
}
}
};

最后不忘记给app加上访问网络的权限

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

效果图

初始化界面->点击Create界面->成功获取验证码界面->Create空白验证码界面->

中文测试->获取验证码超时界面

一些总结

  1. 最大的问题在于访问该网络服务的时候经常超时,因此使用try语句运行,后面捕获异常即可。
  2. 本来打算ProgressDialog可以取消,然后停止或注销相应的子线程,但是发现该做法会造成内存泄漏,在官方文档和Android Studio中均有说明,后来选择使用boolean成员变量达到相同目的。

了解Android中网络通讯的多种方法,进行简单的总结

  • 针对TCP网络的Socket和ServerSocket方法

    该方法和Java中的Socket编程一致,用到了Send和Receive两个方法。
  • 针对UDP的DatagramSocket和DatagramPackage方法

    该方法和Java中的一致,和上面的差不多,也是监听端口,用到了Send和Receive方法。
  • 针对URL的HttpClient和HttpURLConnection方法

    该方法主要用过URL使用TCP的传输层协议完成通信,有超时和重传次数等设置,可以通过URL中特定的参数访问网络。
  • 针对Http的Apache Http方法

    该方法主要使用了Http网络协议中的GET和POST请求,可以被重定向,可以返回任意内容。封装得比较好,使用起来比较方便。
  • 针对WebService的Xmlrpc,Jsonrpc和Ksoap2等方法

    该方法主要方便在于用有限的枚举类型访问相应的WebService,从而得到相应的服务内容,是专门用来请求WebService的方法。
  • 针对Web的WebView方法

    该方法使用了Google的开源Web浏览器渲染特定的Web页面在一定的手机区域,有UI界面,可以直观得看到上网的内容。

工程下载

传送门:下载

Android实现KSOAP2访问WebService的更多相关文章

  1. Android使用KSOAP2调用WebService及正确导入jar包的问题(转)

    Android使用KSOAP2调用WebService及正确导入jar包的问题(转)     错误信息 最近在学Android使用KSOAP2调用现有的Webservice的方法,期间在网上找了很多代 ...

  2. Android 使用 ksoap2-android 访问WebService(C#)

    Android 客户端与后台数据交互的方式有很多种.今天这里记录一下,与WebService的数据交互. 新建一个简单的WebService 创建方式如下: 创建好的项目是这样的. 我们在里面写几句简 ...

  3. Android通过soap2访问webservice遇到HTTP request failed, HTTP status: 302的问题

    笔者用C#在服务器端写了一个Webservice,然后再Android客户端通过soap2调用webservice的函数,遇到了HTTP request failed, HTTP status: 30 ...

  4. Android 基于ksoap2的webservice请求的学习

    [学习阶段] WebService网络请求? 其实我也是第一次遇到,之所以有这个需要是因为一些与 ERP 相关的业务,需要用到这样的一个请求方式. 开始学习WebService ①当然是百度搜索,这里 ...

  5. Android使用ksoap2调用C#中的webservice实现图像上传

    目录: 一. android使用ksoap2调用webservice 二. 异步调用 三. Android使用ksoap2调用C#中的webservice实现图像上传参考方法 四. 图像传输中Base ...

  6. Android访问WebService的两种方法

    首先解释一下WebService:WebService是一种基于SOAP协议的远程调用标准.通过WebService可以将不同操作系统平台,不同语言.不同技术整合到一起.详细见:http://baik ...

  7. 在Android 中使用KSOAP2调用WebService

    WebService 是一种基于SOAP协议的远程调用标准.通过WebService可以将不同操作系统平台,不同语言.不同技术整合到一起.在Android SDK中并没有提供调用WebService的 ...

  8. Android局域网访问webservice以及其中的一些问题

    应老师的要求,要做个安卓app,实现备份app上的数据到服务器上的mongodb上,网上搜了下相关的实现方式.利用webservice技术,具体来说就是客户端直接调用服务器端的接口.之前从来没接触这玩 ...

  9. Android通过ksoap2这个框架调用webservice大讲堂

    昨天有人问我Android怎么连接mysql数据库,和对数据库的操作呀,我想把,给他说说json通信,可是他并不知道怎么弄,哎算了吧,直接叫他用ksoap吧,给他说了大半天,好多零碎的知识,看来还是有 ...

随机推荐

  1. PHP isset()与empty()的区别

    PHP的isset()函数 一般用来检测变量是否设置 格式:bool isset ( mixed var [, mixed var [, ...]] ) 功能:检测变量是否设置 返回值: 若变量不存在 ...

  2. 法线贴图——Normal Mapping

    对于不曾学过.用过法线贴图的人来说,提到法线贴图,经常会提到的问题是什么是法线贴图?法线贴图用于解决什么问题?法线贴图的原理是什么?本文将就这三个问题阐述本人的一些见解,各位不喜勿喷!!! 谈到法线贴 ...

  3. Objective-C中#define的常见用法

    参考博客 http://blog.csdn.net/kindazrael/article/details/8108868 在C语言中,预处理代码是非常强大的工具,能让代码变得可读性和可维护性更强.预处 ...

  4. 手机连接wifi自动弹窗的原理及其实现方案

    一.手机连上wifi后会自动弹窗的原理 生活中,有很多需要认证的路由器,手机连接wifi热点后会自动弹出一个网页,让用户输入账号和密码,比如星巴克,肯地基,麦当劳,甚至是火车站和机场的候车室.其实这是 ...

  5. zencart安装第三步出现空白

    问题描述:在安装zencart时,在第三步同意协议,然后点击下一步时,页面经过漫长的等待后就显示空白. 解决方法:打开php.ini,将max_execution_time = 30 -> ma ...

  6. 使用userdel命令删除Linux用户

    serdel是什么 userdel 是一个底层用于删除用户的工具.在 Debian 上,我们通常会使用 deluser 命令.userdel 会查询系统账户文件,例如 /etc/password 和  ...

  7. C#操作xml

    最进在做一个项目,需要用到xml做配置文件,但是自己忘的差不多了,所以就温习了一遍.以下是我项目中所用到的,所以肯定也不全面. 1.新建xml文件 using System.Xml;//需要引用 st ...

  8. 为 HTML 添加新元素

    你可以为 HTML 添加新的元素. 该实例向 HTML 添加的新的元素,并为该元素定义样式,元素名为 <myHero> : 实例 <!DOCTYPE html> <htm ...

  9. ajax翻页效果模仿yii框架

    ajax翻页效果,模仿yii框架. 复制代码代码如下: <!DOCTYPE html>  <html>  <head>  <title>ajax分页_w ...

  10. mysql实体关系(mysql学习五)

    实体关系  表设计 1:1 两个实体表内,存在相同的主键字段 如果记录的主键值等于另一个关系表内记录的主键值,则两条记录的对应为一一对应 优化上称为垂直分割 1:n 一个实体对应多个其他实体(一个班级 ...