实例基于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的封装的更多相关文章

  1. 基于jeesite+android开发 电子商务系统免费教程

    下载地址: jeesite免费教程 基于jeesite+android开发 电子商务系统免费教程 基于jeesite+android开发 电子商务系统免费教程 这个教程已经录制完很久了,一直没有公开, ...

  2. 分享基于.NET动态编译&Newtonsoft.Json封装实现JSON转换器(JsonConverter)原理及JSON操作技巧

    看文章标题就知道,本文的主题就是关于JSON,JSON转换器(JsonConverter)具有将C#定义的类源代码直接转换成对应的JSON字符串,以及将JSON字符串转换成对应的C#定义的类源代码,而 ...

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

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

  4. ksoap2 android 调用WebService

    webService,soap,wsdl的基本概念? 详情请看维基百科 基于soap 1.1, soap 1.2 的请求和响应数据源 查找了很久都是基于json格式传输数据,但是最终还是找到了基于xm ...

  5. android ORM框架ORMLite封装

    源码:http://download.csdn.net/detail/a924571572/9415506 一.框架效率对比 由于目前公司里面android端数据的数据量基本在千条以内,所以选择了更为 ...

  6. 12.21-Android WebService(基于KSOAP2)

    KSOAP2_连接WebService *****我是小知识点******** Ksoap2提供了对soap序列化更好的支持.Ksoap2是一个轻量级的J2ME平台的实现框架,提供了soap协议消息的 ...

  7. Android RxJava+Retrofit完美封装

    作者简介 本篇来自 小河马 的投稿,分享了自己是如何进行 RxJava+Retrofit 的封装.本文的技术点自然没话说,另外对于这种模块化的思路,希望能帮助到大家.最后提前祝大家周末愉快以及圣诞快乐 ...

  8. Android Sqlite 工具类封装

    鉴于经常使用 Sqlite 数据库做数据持久化处理,进行了一点封装,方便使用. 该封装类主要支持一下功能 支持多用户数据储存 支持 Sqlite数据库升级 支持传入 Sql 语句建表 支持 SQLit ...

  9. Android常见工具类封装

    MD5加密 import android.annotation.SuppressLint; import java.security.MessageDigest; public class MD5 { ...

随机推荐

  1. day18-事务与连接池 3.jdbc中事务操作介绍

    那么我们都是通过程序操作数据库.所以要了解jdbc下怎样对事务操作.jdbc如何操作事务? 自动事务false那就不开了呗相当于开启事务. package cn.itcast.transaction; ...

  2. 【总结整理】AMAP学习AMAP.PlaceSearch()

    http://lbs.amap.com/api/javascript-api/reference/search#m_AMap.PlaceSearch http://lbs.amap.com/api/j ...

  3. 【总结整理】天地图WMTS服务与卫星图匹配与坐标转换

    http://blog.sina.com.cn/s/blog_60abbd570102wnhh.html

  4. Ros疑问汇总

    一.机器人描述文件三个: 机器人主体body文件: gazebo属性文件: 主文件 smartcar.urdf: 二.启动文件smartcar_display.rviz.launch:启动节点和模拟器 ...

  5. C++面向对象类的实例题目四

    题目描述: 以面向对象的概念设计一个类,此类包含3个私有数据:unlead.lead(无铅汽油和有铅汽油)以及total(当天总收入,无铅汽油的价格是17元/升,有铅汽油的加个是16元/升),请以构造 ...

  6. Tensorflow fetch和feed

    import tensorflow as tf #Fetch input1 = tf.constant(1.0)input2 = tf.constant(3.0)input3 = tf.constan ...

  7. HDOJ 1023 Train Problem II 卡特兰数

    火车进站出站的问题满足卡特兰数...卡特兰数的相关知识如下: 卡特兰数又称卡塔兰数,是组合数学中一个常出现在各种计数问题中出现的数列.由以比利时的数学家欧仁·查理·卡塔兰 (1814–1894)命名. ...

  8. 100211D Police Cities

    传送门 分析 看到这个题我们的第一反应自然是Tarjan缩点,在这之后我们可以发现实际只要在缩点之后所有出度或入度为0的点布置警察局就可以达到要求,我们用dpij表示考虑前i个出度或入度为0的点共布置 ...

  9. Laradock使用教程(新手版)

    Laradock使用教程 背景 最近我们公司把开发环境从windows系统换到了Ubuntu系统.用windows系统的时候,我们一般用phpStudy集成环境的比较多.换到Linux环境下,我们选择 ...

  10. 搭建邮件服务器 Postfix + Dovecot (CentOS)

    最近分配到一台ECS服务器,需要搭建一台邮件服务器. 查了一波资料选择了Postfix (smtp)和 Dovecot(pop3). 推荐教程:http://www.cnblogs.com/zlbei ...