基于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();    }});
 
时间: 2024-12-29 10:53:05

基于ksoap2-android的soap的封装的相关文章

Android基于ksoap2调用WCF服务(二):Android篇

上一篇通过一个非常简单的例子,完成了一个WCF的服务.接下来介绍一下Android端. Android端调用WCF,采用基于ksoap2包来实现. 下载地址(这个需要fan qiang访问,你们懂的):https://code.google.com/p/ksoap2-android/ 我用的3.3.0版本,我传到csdn上,上面地址如果不能访问,可以用这个地址:http://download.csdn.net/detail/cnryc/7695437 程序的源代码下载地址:http://down

浅谈android中的自定义封装易用的Dialog

好久没写android的博客,最近在做一个android的项目,里面用到我们经常用的一个控件就是对话框,大家都知道android自带的对话框是很丑的,android5.x之后除外.所以就出现了自定义view,自己定义美观的对话框.好我们就来自定义对话框. 整体思路:定义一个类然后去继承Dialog类,然后重写相应的构造器方法.大家都知道一般的对话框的创建过程都是来一个AlertDialog.Builder对象,然后使用一些set方法来设置标题内容以及设置一些自定义的view和点击的Button以

Retrofit – Java(Android) 的REST 接口封装类库

Retrofit 和Java领域的ORM概念类似, ORM把结构化数据转换为Java对象,而Retrofit 把REST API返回的数据转化为Java对象方便操作.同时还封装了网络代码的调用. 例如: public interface GitHubService { @GET("/users/{user}/repos") List<Repo> listRepos(@Path("user") String user); } 定义上面的一个REST API

android 调用相册-照相机封装

把这两个功能封装起来,经常使用到. private static Uri photoUri; public static final int NONE = 0; public static final int PHOTOHRAPH = 1;// 拍照 public static final int PHOTOZOOM = 2; // 缩放 public static final int PHOTORESULT = 3;// 结果 public static final String IMAGE_

Android Toast(吐司) 简单封装

Android Toast(吐司)简单封装,且解决了Toast显示时间叠加问题. public class ToastUtil { private static Toast toast=null; public static void showToast(Context context,String content){ if(toast!=null) { toast.cancel(); } toast=Toast.makeText(context,content,Toast.LENGTH_LON

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

原文:分享基于.NET动态编译&Newtonsoft.Json封装实现JSON转换器(JsonConverter)原理及JSON操作技巧 看文章标题就知道,本文的主题就是关于JSON,JSON转换器(JsonConverter)具有将C#定义的类源代码直接转换成对应的JSON字符串,以及将JSON字符串转换成对应的C#定义的类源代码,而JSON操作技巧则说明如何通过JPath来快速的定位JSON的属性节点从而达到灵活读写JSON目的. 一.JSON转换器(JsonConverter)使用及原理介

Android ToolBar 的简单封装

使用过 ToolBar 的朋友肯定对其使用方法不陌生,因为其用法很简单,如果对 ActionBar 使用比较熟练的人来说,ToolBar 就更容易了!不过,相信大家在使用的过程中都遇到过这样一个问题,需要在每一个我们要使用的 xml 中添加 ToolBar 这个控件,比如我需要在 MainActivity中使用 ToolBar,则他的 xml 文件需要这样写, <RelativeLayout xmlns:android="http://schemas.android.com/apk/res

Android 框架修炼-自己封装双缓存管理框架库

一.概述 Android开发中,网络请求是很重要的一部分,而缓存网络请求来的图片或者响应结果字符串或者结果流,既可以省流量,同时也可以帮助我们 解决无网或弱网情况下加载情况,当然也可以提升程序性能效率.纵所周知,缓存管理中肯定需要用到内存缓存,这里我们采用LruCache来管理内存的缓存. LruCahce虽然速度快,但是只是内存级别的缓存,为了实现持久化的缓存,我们还需要文件级别的缓存,也就是说我们要把缓存保存到文件,而文件则是保存 到手机存储或者SD卡存储中,即实现Disk级别的缓存,这里我

Android 工具类 SharedPreferences 封装

SharedPreferences 是 Android 数据存储方式中的一种,特别适合用来存储少量的.格式简单的数据,比如应用程序的各种配置信息,如是否打开音效,是否开启震动等等. SharedPreferences 存储数据的位置和格式 SharedPreferences 将数据以键值对的形式,存储在 /data/data/<package name>/shared_prefs 目录下面,以 XML 的格式保存,该 XML 文件的根元素是 <map.../>,该元素里每个子元素代