Android实现KSOAP2访问WebService
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空白验证码界面->
 
 
 
中文测试->获取验证码超时界面
 
一些总结
- 最大的问题在于访问该网络服务的时候经常超时,因此使用try语句运行,后面捕获异常即可。
 - 本来打算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的更多相关文章
- Android使用KSOAP2调用WebService及正确导入jar包的问题(转)
		
Android使用KSOAP2调用WebService及正确导入jar包的问题(转) 错误信息 最近在学Android使用KSOAP2调用现有的Webservice的方法,期间在网上找了很多代 ...
 - Android 使用 ksoap2-android 访问WebService(C#)
		
Android 客户端与后台数据交互的方式有很多种.今天这里记录一下,与WebService的数据交互. 新建一个简单的WebService 创建方式如下: 创建好的项目是这样的. 我们在里面写几句简 ...
 - Android通过soap2访问webservice遇到HTTP request failed, HTTP status: 302的问题
		
笔者用C#在服务器端写了一个Webservice,然后再Android客户端通过soap2调用webservice的函数,遇到了HTTP request failed, HTTP status: 30 ...
 - Android 基于ksoap2的webservice请求的学习
		
[学习阶段] WebService网络请求? 其实我也是第一次遇到,之所以有这个需要是因为一些与 ERP 相关的业务,需要用到这样的一个请求方式. 开始学习WebService ①当然是百度搜索,这里 ...
 - Android使用ksoap2调用C#中的webservice实现图像上传
		
目录: 一. android使用ksoap2调用webservice 二. 异步调用 三. Android使用ksoap2调用C#中的webservice实现图像上传参考方法 四. 图像传输中Base ...
 - Android访问WebService的两种方法
		
首先解释一下WebService:WebService是一种基于SOAP协议的远程调用标准.通过WebService可以将不同操作系统平台,不同语言.不同技术整合到一起.详细见:http://baik ...
 - 在Android 中使用KSOAP2调用WebService
		
WebService 是一种基于SOAP协议的远程调用标准.通过WebService可以将不同操作系统平台,不同语言.不同技术整合到一起.在Android SDK中并没有提供调用WebService的 ...
 - Android局域网访问webservice以及其中的一些问题
		
应老师的要求,要做个安卓app,实现备份app上的数据到服务器上的mongodb上,网上搜了下相关的实现方式.利用webservice技术,具体来说就是客户端直接调用服务器端的接口.之前从来没接触这玩 ...
 - Android通过ksoap2这个框架调用webservice大讲堂
		
昨天有人问我Android怎么连接mysql数据库,和对数据库的操作呀,我想把,给他说说json通信,可是他并不知道怎么弄,哎算了吧,直接叫他用ksoap吧,给他说了大半天,好多零碎的知识,看来还是有 ...
 
随机推荐
- PAT1023. Have Fun with Numbers
			
//水题,但是考点不水,可能用的strlen属于string库,但是只能用于字符,不能用数字,因为\0就是0.出现0无法判断,其次二倍时有可能有进位 //第一次在二倍进位上出了问题 #include& ...
 - 理解Linux启动过程
			
传统的Linux系统启动过程主要由著名的init进程(也被称为SysV init启动系统)处理,而基于init的启动系统被认为有效率不足的问题,systemd是Linux系统机器的另一种启动方式,宣称 ...
 - 前端开发中的SEO
			
什么是SEO SEO由英文Search Engine Optimization缩写而来,中文意译为"搜索引擎优化".SEO是指从自然搜索结果获得网站流量的技术和过程,是在了解搜索引 ...
 - Spring与Quartz的整合实现定时任务调度
			
摘自: http://kevin19900306.iteye.com/blog/1397744 最近在研究Spring中的定时任务功能,最好的办法当然是使用Quartz来实现.对于一个新手来说,花了我 ...
 - Python之路【第二篇】:Python基础(一)
			
一.作用域 对于变量的作用域,执行声明并在内存中存在,该变量就可以在下面的代码中使用. 1 2 3 if 1==1: name = 'wupeiqi' print name 下面的结论对吗? ...
 - javaSE第九天
			
第九天 50 1. final关键字(掌握) 50 (1)定义: 50 (2)特点: 51 (3)面试相关: 51 A:final修饰的局部变量 51 B:fi ...
 - gdb调试工具使用方法分享
			
刚才看了一个CSDN上分享gdb调试工具使用的教程,讲得非常好,推荐到这里: http://blog.csdn.net/liigo/article/details/582231
 - 新版本的pdo会有这个问题
			
新版本的pdo会有这个问题: General error: 2014 Cannot execute queries while other unbuffered queries are active. ...
 - 三国塔防游戏android源码
			
三国塔防游戏源码,这个游戏源码比较完整的,因为上传有20M限制,把代码工程包分开了,主文件是TFGame,其他res大家按照安卓包加进去就行,欢迎下载并交流 ,大家可以参考一下吧.<ignore ...
 - 合并多个List<T>类型并通过LINQ按指定属性排序
			
后台CS代码: namespace WebFormTest.TestCollect { public partial class ListTest : System.Web.UI.Page { pro ...