android获取webservice接口的数据

来源:互联网 发布:java jdk mac 编辑:程序博客网 时间:2024/05/17 08:23

前言
其实我不怎么会这个,我是边看源码边做翻译的,突然发现自己好喜欢翻译别人的东西,这个源码来自于我的项目,总是用却从未看过为嘛要这样用,废话不多说,开始看吧,demo下载地址:
(还没写完,写完就发上来)
1、首先是给listview填充数据,那么就得发送网络请求对吧,看下面:

第一步

2.我们点击cgquery方法到接口的实现类去,如下:

第二步

3.我们先看BeanGeneralInquiries这个类

这个类张这样
这里写图片描述

4我们来看看BeanGeneralInquiries类继承的Bean类

这里写图片描述

5,在这里你就可以返回去再把图看一遍,就明白了,接下来我们还是看这个类GetMessageImpt里面的这个方法cgquery

这里写图片描述

其实就是这个DataSources类的用法。源码翻译如下:

/*** * 泛型强制规定传送的数据类型为继承 com.sky.oa.Bean * 不懂泛型的看这里http://www.cnblogs.com/panjun-Donet/archive/2008/09/27/1300609.html */public class DataSources<   T extends Bean> {    //DataSourceHandler继承handler的类,构造器的参数可以是任何类型    DataSourceHandler mHandler = new DataSourceHandler(this);    private static final int GETDATA_COMPLETE = 0;//获取数据完成的变量    private static final int GETDATA_ERROR = -1;//获取数据错误的变量    private static final int GETDATA_START = 1;//获取数据开始的变量    //之前就说过哪里要获取网络数据哪个就要实现这个接口,就定义了3个方法    GetDataListener mGetDataListener = null;    private String actionName;    /**** 以下代码与getdata有关 *****/    //getdata在GetMessageImpt中每个实现的方法都是调用这个,参数代表b是T类型的对象,而T是继承Bean类的对象,也就是传个    //Bean类或其子类过来就好    public void getdata(final T b) {        //获取数据的时候新开一个线程        new Thread() {            public void run() {                sendMessage(GETDATA_START, null, null);//发送一个获取网络数据开始的信号给handler                try {                    JsonHTTP.println("baenname" + b.beanName);//打印Bean类的子类的类名                    Regix regix= new Regix();//这个类专门用来获取网络数据的类                    // regix.getdate(b)就是获取网路数据的方法                    sendMessage(GETDATA_COMPLETE, regix.getdate(b), b.getClass().getName());//发送网络数据请求完成的消息给handler                } catch (Exception e) {                    sendMessage(GETDATA_ERROR, null, null);//发送获取数据异常的消息                    e.printStackTrace();                }            }        }.start();    }    /****** 以下代码是与监听接口有关 *****/    // 定义getDATA方法监听接口    public interface GetDataListener {        void getdata_start();        void getdata_complete(Object list, String s);        void getdata_err();    }    // 定义一个DataSource与 UI线程交互对象    class DataSourceHandler extends Handler {        public DataSourceHandler(DataSources<?> manager) {        }        // 处理接收到的消息 通知UI线程更新        public void handleMessage(Message msg) {            switch (msg.what) {            //根据收到的消息类型进行回调            case GETDATA_COMPLETE:                if (mGetDataListener != null) {                    mGetDataListener.getdata_complete(msg.obj, actionName);                }                break;            case GETDATA_ERROR:                if (mGetDataListener != null) {                    JsonHTTP.println("getdata err");                    mGetDataListener.getdata_err();                }                break;            case GETDATA_START:                if (mGetDataListener != null) {                    JsonHTTP.println("getdata start");                    mGetDataListener.getdata_start();                }                break;            }        }    }    /*** 向 Handler 发送消息 该方法在getdata的过程中被调用 ,发送命令要开始啦,结束啦之类的*/    private void sendMessage(int what, Object obj, String actionname) {        // 构造需要向 Handler 发送的消息        Message msg = null;       //obj对应的就是regix.getdate(b)网路获取数据的结果哈        try {            if (what == GETDATA_COMPLETE && obj != null) {                //打印加密后的网络数据,并将其发送给handler                JsonHTTP.println("sendMessage`s obj "+ SimpleCrypto.decrypt("geliang", obj.toString()));                /**** 数据解密 *****/                msg = mHandler.obtainMessage(what,                        SimpleCrypto.decrypt("geliang", obj.toString()));                actionName = actionname;                mHandler.sendMessage(msg);                return;                //如果获取的网络数据为空的话说明报错了,发送消息给handler通知更新ui            } else if (what == GETDATA_COMPLETE && obj == null) {                sendMessage(GETDATA_ERROR, null, null);                return;            }            //如果发松消息错误了的话就可以直接发个null过去            msg = mHandler.obtainMessage(what, null);            actionName = actionname;            mHandler.sendMessage(msg);        } catch (Exception e) {            e.printStackTrace();        }    }    //我们可以吧这个理解为初始化GetDataListener的对象,用于方便回调通知UI,之前在获取网络数据的    //那个类不是实现了GetDataListener接口并实现了它的三个方法么    // 回调转型    public void setGetDataSourceListener(Object a) {        mGetDataListener = (GetDataListener) a;    }}

6上面这个类看完了其实就是一个handler类发消息接受消息的类,通过接口进行回调的类,下面就是获取网络数据的重点了。regix.getdate(b)。下面是Regix类的翻译。
//这个就是获取网络数据的时候得到请求的参数并将其封装在SoapObject对象里。

public String getdate(T t) throws Exception {JSONObject jsonObject = new JSONObject();String actionName = "";// 遍历t对象所对应类的属性,其实就是之前网络数据参数封装的那个继承Bean的类for (Field fd : t.getClass().getFields()) {String filedName = fd.getName();// 属性的名字//如果那个参数Bean的子类的属性名不叫beanname或者action,就代表是请求的参数,这个时候就要记录下来if (!filedName.equals("beanName") && !filedName.equals("action")) { // 获得属性名字的第一字母的大写字母(一般get方法后面都是get+属性名大写字母+完整的属性名)String firstLetter = filedName.substring(0, 1).toUpperCase();//获得get那个属性的方法名String getMethodName = "get" + firstLetter + filedName.substring(1); // 转换成字段的get方法//通过上面的方法名拿到这个属性所对应的值(利用的反射)Method getMethod = t.getClass().getMethod(getMethodName, new Class[] {});String values = ""; // 属性的值if (getMethod.invoke(t, new Object[] {}) == null) {values = "";} else {values = getMethod.invoke(t, new Object[] {}).toString();try {//用JSONObject将键值对装起来,键为属性名,值为属性的值jsonObject.put(filedName, values.trim());} catch (JSONException e1) {e1.printStackTrace();}}}//以和上面同样的方法将actionname赋值if (filedName.equals("action")) {String firstLetter = filedName.substring(0, 1).toUpperCase(); // 获得字段第一个字母大�?String getMethodName = "get" + firstLetter + filedName.substring(1); // 转换成字段的get方法Method getMethod = t.getClass().getMethod(getMethodName, new Class[] {});if (getMethod.invoke(t, new Object[] {}) == null) {actionName = "";} else {actionName = getMethod.invoke(t, new Object[] {}).toString();}}}//生成一个SoapObject对象,webservice是以soap协议传输的SoapObject request = new SoapObject("http://com", actionName);//将请求参数加密后装载 //SimpleCrypto.encrypt将传入的值加密,"skyfront"是解密的钥匙,可以随便写request.addProperty("JsonObject", SimpleCrypto.encrypt("skyfront",AndroidUtil.formatJsonStringByClient(GlobeVriable.DATATYPE, jsonObject)).toString());//AndroidUtil.formatJsonStringByClient这个方法就是将jsonobject再打包一次,就是再用个jsonobject把它给put一次JsonHTTP.println(AndroidUtil.formatJsonStringByClient(GlobeVriable.DATATYPE, jsonObject).toString());//返回得到的网络数据return JsonHTTP.getobject(actionName, request);}

网络请求的方法如下:

public static String getobject(String nowURL, SoapObject request)            throws Exception {//      String webseverurl = "http://172.27.100.172:80/HNOA_middleware/services/";//      String webseverurl = "http://192.168.1.201:8089/HNOA_middleware/services/";        //网络请求的url,就是ip加上端口号再加上项目名和那个方法的类名        String webseverurl = "http://" + GlobeVriable.ip + ":" +                     GlobeVriable.port + "/HNOA_middleware/services/";         //发送过去的数据就是刚刚装载的那个SoapObject对象        JsonHTTP.println("发送过去的数据" + request);        String object = "";        //这里再把那个方法名串起来就是具体的地址了        String URL = webseverurl + nowURL;        JsonHTTP.println("<--URL<--" + URL);        AndroidHttpTransport androidHttpTransport = new AndroidHttpTransport(URL);// 创建andridHTPP协议运输对象(服务器网址�?        androidHttpTransport.debug = true;//开启debug模式        JsonHTTP.println("-----------------------2");        SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(                SoapEnvelope.VER10);// 序列号信�?        envelope.bodyOut = request;//      envelope.dotNet = true;        JsonHTTP.println("-----------------------3");        envelope.setOutputSoapObject(request); // 绑定请求        JsonHTTP.println("-----------------------4");        JsonHTTP.println(envelope);        androidHttpTransport.call(null, envelope); // (运输对象)把网址给(序列化数据)        JsonHTTP.println("-----------------------5");        object = envelope.getResponse().toString(); // 序列化数据获取请求生成对象        JsonHTTP.println("得到的数据" + object);        JSONObject jsonObject = new JSONObject(object.toString());        object = jsonObject.optString(GlobeVriable.USERNAME);        object = ZipUtils.uncompress(object);// 解压缩        JsonHTTP.println("解压后的数据" + object);        return AndroidUtil.unformatJsonGetData(object);    }

这样就完成了,其实上面还有一部分的难点还没琢磨透,等我把web端的webservice接口完善了就继续把这个写好。

0 0
原创粉丝点击