基于ksoap2-android的soap的封装
实例基于ksoap2-android-assembly-3.3.0-jar-with-dependencies.jar
1:定义回调接口,通过泛型确定返回值类型
package com.ciii.bd.electrombile.soap; /**
* 处理请求服务器的回调接口
* Created by lipanquan on 2016/12/26.
*/
public class SoapCallback<ResponseResult> {
/**
* 请求失败处理的结果,Run main thread
*/
public void onFailResult() { } /**
* 请求成功处理的结果,Run main thread
*
* @param responseResult 请求成功处理后的结果
*/
public void onResponseResult(ResponseResult responseResult) { } /**
* onResponseResult 方法之后执行
*/
public void onFinally() { }
} 2:处理Soap请求的工具类,通过反射和泛型配合直接回调给调用者指定泛型的结果 import android.os.Handler;
import android.os.Looper;
import android.os.Message; import com.ciii.base.utils.GsonUtils;
import com.ciii.bd.electrombile.okhttp.OkHttpCallback; import org.ksoap2.SoapEnvelope;
import org.ksoap2.serialization.SoapObject;
import org.ksoap2.serialization.SoapPrimitive;
import org.ksoap2.serialization.SoapSerializationEnvelope;
import org.ksoap2.transport.HttpTransportSE; import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.Map; /**
* 处理Soap请求的工具类
* Created by lipanquan on 2016/12/26.
*/
public class SoapNetUtils { /**
* 请求处理成功的回调标示
*/
private static final int MESSAGE_POST_SUCCESS = 0x1; /**
* 请求处理失败的回调标示
*/
private static final int MESSAGE_POST_FAIL = 0x2; /**
* 命名空间
*/
private static String namespace; /**
* 服务器的地址
*/
private static String url; private SoapNetUtils() {
} private static SoapNetUtils instance = new SoapNetUtils(); /**
* 获取处理Soap请求的工具类
*
* @return 处理Soap请求的工具类
*/
public static SoapNetUtils getInstance() {
return instance;
} /**
* 初始化Soap协议请求工具类对象
*
* @param namespace 命名空间
* @param url 服务器的地址
*/
public void initSoap(String namespace, String url) {
SoapNetUtils.namespace = namespace;
SoapNetUtils.url = url;
if (SoapNetUtils.namespace == null || SoapNetUtils.namespace.equals("") ||
SoapNetUtils.url == null || SoapNetUtils.url.equals("")) {
throw new RuntimeException("namespace不能为空,并且url不能为空。初始化Soap协议请求工具类对象失败");
}
} /**
* 执行请求
*
* @param t 指定返回结果的class对象文件
* @param urlType 请求的标示类型
* @param parameters 参数列表
* @param callback 回调函数
* @param <T> 指定返回结果的class对象文件
*/
public <T> void doSoapRequest(final Class<T> t, final String urlType, final Map<String, Object> parameters, final SoapCallback callback) {
if (SoapNetUtils.namespace == null || SoapNetUtils.namespace.equals("") ||
SoapNetUtils.url == null || SoapNetUtils.url.equals("")) {
throw new RuntimeException("initSoap(String namespace, String url)方法进行初始化Soap协议请求工具类之后再使用...");
}
new Thread(new Runnable() {
@Override
public void run() {
try {
T result = doSoap(t, urlType, parameters, callback);
//向主线程发送消息成功,getTelAddress函数执行完毕
Message msg = Message.obtain();
msg.what = MESSAGE_POST_SUCCESS;
msg.obj = new MyExecuteTaskResult<T>(callback, result);
getHandler().sendMessage(msg);
} catch (Exception e) {
//向主线程发送消息成功,getTelAddress函数执行完毕
Message msg = Message.obtain();
msg.what = MESSAGE_POST_FAIL;
msg.obj = new MyExecuteTaskResult<T>(callback, null);
getHandler().sendMessage(msg);
}
}
}).start();
} /**
* 正真执行网络请求
*
* @param t 指定返回结果的class对象文件
* @param urlType 请求的标示类型
* @param parameters 参数列表
* @param callback 回调函数
* @param <T> 指定返回结果的class对象文件
*/
private <T> T doSoap(Class<T> t, String urlType, Map<String, Object> parameters, SoapCallback callback) throws Exception {
Object instance = t.newInstance();
SoapObject soapObject = new
SoapObject(namespace, urlType);//"UserLogin"创建SOAP对象
//设置属性,这些属性值通过SOAP协议传送给服务器
Iterator<Map.Entry<String, Object>> it = parameters.entrySet().iterator();
while (it.hasNext()) {
Map.Entry<String, Object> entry = it.next();
if (entry.getValue() instanceof ArrayList) {
SoapObject parameterValue = new SoapObject();
for (String str : (ArrayList<String>)entry.getValue()) {
parameterValue.addProperty("long", Long.valueOf(str));
}
soapObject.addProperty(entry.getKey(), parameterValue);
} else
soapObject.addProperty(entry.getKey(), entry.getValue());
}
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(
SoapEnvelope.VER11);
envelope.bodyOut = soapObject;
envelope.dotNet = true;
envelope.setOutputSoapObject(soapObject);
HttpTransportSE httpTransportSE = new HttpTransportSE(url);
try {
//调用服务
httpTransportSE.call(namespace + urlType, envelope);
} catch (Exception e) {
e.printStackTrace();
}
if (envelope.bodyIn instanceof SoapObject) {
SoapObject response = (SoapObject) envelope.bodyIn;
Field[] fields = instance.getClass().getDeclaredFields();
for (int i = 0; i < fields.length; i++) {
fields[i].setAccessible(true);
Class<?> type = fields[i].getType();
Object fieldValue;
try {
fieldValue = response.getProperty(fields[i].getName());
} catch (Exception e) {
continue;
}
Object o;
if (fieldValue instanceof SoapPrimitive) {
o = GsonUtils.getInstance().j2O(fieldValue.toString(), type);
fields[i].set(instance, o);
} else if (fieldValue instanceof SoapObject) {
if (type == ArrayList.class) {
SoapObject object = (SoapObject) fieldValue;
o = new ArrayList();
Method m = o.getClass().getMethod("add", Object.class);
for (int j = 0; j < object.getPropertyCount(); j++) {
SoapPrimitive primitive = (SoapPrimitive) object.getProperty(j);
m.invoke(o, primitive.getValue());
}
fields[i].set(instance, o);
}
continue;
} else {
continue;
}
fields[i].set(instance, o);
}
}
return (T) instance;
}
private static InternalHandler sHandler;
private static Handler getHandler() {
synchronized (OkHttpCallback.class) {
if (sHandler == null) {
sHandler = new InternalHandler();
}
return sHandler;
}
}
private static class MyExecuteTaskResult<Result> {
@SuppressWarnings("rawtypes")
final SoapCallback mTask;
final Result mData;
public MyExecuteTaskResult(SoapCallback task,
Result data) {
mTask = task;
mData = data;
}
}
private static class InternalHandler extends Handler {
public InternalHandler() {
super(Looper.getMainLooper());
}
@SuppressWarnings("unchecked")
@Override
public void handleMessage(Message msg) {
MyExecuteTaskResult<?> result = (MyExecuteTaskResult<?>) msg.obj;
switch (msg.what) {
case MESSAGE_POST_SUCCESS:
result.mTask.onResponseResult(result.mData);
break;
case MESSAGE_POST_FAIL:
result.mTask.onFailResult();
break;
}
result.mTask.onFinally();
}
}
}
3:使用
SoapNetUtils.getInstance().doSoapRequest(User.class, URL_TYPE_LOGIN, parameters, new SoapCallback<User>() {
@Override
public void onResponseResult(User user) {
if (user.isLoginSuccessed()) {
user.setUserName(et_login_username.getText().toString());
// 保存用户名和密码
putString(SPKey.KEY_USERNAME, et_login_username.getText().toString().trim());
if (isAutoLogin)
putString(SPKey.KEY_PASSWORD, et_login_password.getText().toString().trim());
getMyApplication().setCurrentUser(user);
showToastShort(R.string.toast_login_success);
startEnterActivity(SelectDeviceListActivity.class, true);
} else {
showToastShort(R.string.toast_login_fail);
}
}
@Override
public void onFailResult() {
showToastShort(R.string.toast_login_fail);
}
@Override
public void onFinally() {
btn_login.setEnabled(true);
dismissMDialog();
}
});
基于ksoap2-android的soap的封装的更多相关文章
- 基于jeesite+android开发 电子商务系统免费教程
下载地址: jeesite免费教程 基于jeesite+android开发 电子商务系统免费教程 基于jeesite+android开发 电子商务系统免费教程 这个教程已经录制完很久了,一直没有公开, ...
- 分享基于.NET动态编译&Newtonsoft.Json封装实现JSON转换器(JsonConverter)原理及JSON操作技巧
看文章标题就知道,本文的主题就是关于JSON,JSON转换器(JsonConverter)具有将C#定义的类源代码直接转换成对应的JSON字符串,以及将JSON字符串转换成对应的C#定义的类源代码,而 ...
- Android 基于ksoap2的webservice请求的学习
[学习阶段] WebService网络请求? 其实我也是第一次遇到,之所以有这个需要是因为一些与 ERP 相关的业务,需要用到这样的一个请求方式. 开始学习WebService ①当然是百度搜索,这里 ...
- ksoap2 android 调用WebService
webService,soap,wsdl的基本概念? 详情请看维基百科 基于soap 1.1, soap 1.2 的请求和响应数据源 查找了很久都是基于json格式传输数据,但是最终还是找到了基于xm ...
- android ORM框架ORMLite封装
源码:http://download.csdn.net/detail/a924571572/9415506 一.框架效率对比 由于目前公司里面android端数据的数据量基本在千条以内,所以选择了更为 ...
- 12.21-Android WebService(基于KSOAP2)
KSOAP2_连接WebService *****我是小知识点******** Ksoap2提供了对soap序列化更好的支持.Ksoap2是一个轻量级的J2ME平台的实现框架,提供了soap协议消息的 ...
- Android RxJava+Retrofit完美封装
作者简介 本篇来自 小河马 的投稿,分享了自己是如何进行 RxJava+Retrofit 的封装.本文的技术点自然没话说,另外对于这种模块化的思路,希望能帮助到大家.最后提前祝大家周末愉快以及圣诞快乐 ...
- Android Sqlite 工具类封装
鉴于经常使用 Sqlite 数据库做数据持久化处理,进行了一点封装,方便使用. 该封装类主要支持一下功能 支持多用户数据储存 支持 Sqlite数据库升级 支持传入 Sql 语句建表 支持 SQLit ...
- Android常见工具类封装
MD5加密 import android.annotation.SuppressLint; import java.security.MessageDigest; public class MD5 { ...
随机推荐
- repeater的command事件用法
当Repeater里面循环控件时就会用到command, 是Repeater控件的原生事件用法 Repeater里面如果循环控件,控件的ID是会被改变的 repeater.itemcommand+= ...
- ROS Learning-019 learning_tf-03(编程) 添加额外的坐标系 (Python版)
ROS Indigo learning_tf-03 添加额外的坐标系 (Python版) 我使用的虚拟机软件:VMware Workstation 11 使用的Ubuntu系统:Ubuntu 14.0 ...
- HDOJ 1164 Eddy's research I
Problem Description Eddy's interest is very extensive, recently he is interested in prime number. Ed ...
- 2用java代码实现冒泡排序算法(转载)
import java.util.Scanner; public class Maopao { public static void main(String[] args) { System.out. ...
- Luogu 3761 [TJOI2017]城市
BZOJ 4890. 在树上断开一条边之后会形成两个联通块,如果要使这一条边接回去之后保持一棵树的形态,那么必须在两个联通块之间各找一个点连接. 那么,对于每一条可能断开的边,它产生的答案是以下两者的 ...
- Luogu 4363 [九省联考2018]一双木棋chess
发现数据范围很小,想到状压dp,然后就愣住不会了. 表示太菜了并没有接触过轮廓线dp这种操作. 首先发现合法的操作过程中一定是这样子的: 按照行来看发现每一行单调不递增. 我们用$1$来表示竖着的轮廓 ...
- 使用 Bulma
一.起因 最近我在学习 SASS,通过它,可以将 CSS 像编程语言一样书写. 在最近之前,我又学习了 Flex 布局,用起来很方便. 所以,我学习了 Bulma 这个纯 CSS 框架--使用 Fle ...
- Spring-访问静态资源文件的方法
转自: http://blog.163.com/zhangmihuo_2007/blog/static/27011075201453044959574?suggestedreading 如果你的Di ...
- 并发编程学习笔记之可见性&过期数据(二)
想要使用多线程编程,有一个很重要的前提,那就是必须保证操纵的是线程安全的类. 那么如何构建线程安全的类呢? 1. 使用同步来避免多个线程在同一时间访问同一数据. 2. 正确的共享和安全的发布对象,使多 ...
- build linaro 4.8 on ubuntu 12.04 64bit
安装必要的软件 sudo apt-get build-dep gcc binutils gdb sudo apt-get install curl gawk sudo apt-get install ...