zoukankan      html  css  js  c++  java
  • 上门洗车APP --- Androidclient开发 之 网络框架封装介绍(二)

    上门洗车APP --- Androidclient开发 之 网络框架封装介绍(二)

    前几篇博文中给大家介绍了一下APP中的基本业务及开发本项目使用的网络架构:

    上门洗车APP --- Androidclient开发 前言及业务简单介绍

    上门洗车APP --- Androidclient开发 之 网络框架封装介绍(一)


    本篇接着给大家分享网络框架封装。相信感兴趣的朋友已经对上篇博文中的一些开源项目有了些许了解。这里继续为大家介绍关于GenericDataManager 通用网络管理类中的 dataRequest 方法 和 请求參数封装类 RequestParameterFactory

    在上篇博文中我们有介绍 dataRequest 中传入了一些參数,且使用了泛型<T>,以下就给大家介绍传入的详细參数:

    /** 
         * 该方法封装了网络数据请求和数据解析 
         * 并传入回调接口 
         * @param requestId     请求ID 
         * @param requestType   请求类型(此处依据传入的常量仅仅提供了get请求和post请求) 
         * @param urlString     请求URL 
         * @param mParams       请求參数 
         * @param parser        通用数据解析抽象解析器 
         * @param mCallback     自己定义接口回调 
         */  
    public <T> void dataRequest(final int requestId,String requestType,String urlString,RequestParams mParams,  
                final AbstractParser<T> mParser,final IRequestCallback mCallback)

    这里主要给大家说明两个參数,即 final AbstractParser<T>  mParser  和  final IRequestCallback  mCallback ,关于IRequestCallback 上篇已经介绍过。该类是定义的回调接口。该接口中的方法定义目的就是为了让Activity实现做数据回调处理。

    AbstractParser<T> 是个什么玩意呢 ?


    这里先说一下项目中server传递过来的 JSON 数据格式,本着规范易读,维护性好,管理方便的原则,我们统一了JSON格式,例如以下图一、图二中的介绍:

    图 一




    图 二


    也就是说数据格式中的 messagestatusdata 三个字段是固定的。message为String类型。status为int类型,而data呢。有可能是jsonObject
    者jsonArray,故每从server端发出一条请求,若请求成功,则返回格式都如上图二所看到的,数据在data中。

    所以此处我们定义一个model,即Result<T>类,来看下:

    /**
     * @author gao_chun
     *
     */
    public class Result<T> {
    
        private int status;//server返回状态码
        private String message;//message
        private T data;//返回数据
    
        /**
         * @return the status
         */
        public int getStatus() {
    
            return status;
        }
    
        /**
         * @param status the status to set
         */
        public void setStatus(int status) {
    
            this.status = status;
        }
    
        /**
         * @return the message
         */
        public String getMessage() {
    
            return message;
        }
    
        /**
         * @param message the message to set
         */
        public void setMessage(String message) {
    
            this.message = message;
        }
    
        /**
         * @return the data
         */
        public T getData() {
    
            return data;
        }
    
        /**
         * @param data the data to set
         */
        public void setData(T data) {
    
            this.data = data;
        }
    
        public boolean isOK() {
            return status >= 2000 && status < 3000;
        }
    }

    注:<T>。即泛型(Generic Types)。JDK1.5新特性,使用时能够理解为创建一个用类型作为參数的类或方法。也能够这样理解,就是说,若一个类或方法里面要用到另外一个类,但我又不确定所须要用到的那个类的详细类型,所以就用到了Generic Types,这里简单说明,就只是多解释了,朋友若不明确能够去查阅相关文档。


    定义了一个model类,我们还再去定义一个解析器接口,即 IParser<T> ,该接口也使用泛型:

    package org.gaochun.parser;
    
    /**
     * @author gao_chun
     *
     */
    public interface IParser<T> {
    
        public T parse(String data);
    
    }

    那么以下我们再来看这个 AbstractParser<T> 类。这个类是我们定义的一个抽象解析类,且实现了解析器接口,须要注意的是我们定义的解析器 IParser<T> 使用了泛型,model类 Result<T> 也是如此,再次来看详细的 AbstractParser<T>

    import org.gaochun.model.Result;
    import org.gaochun.utils.JsonUtils;
    import org.json.JSONArray;
    import org.json.JSONObject;
    
    /**
     * 抽象解析类
     * 目的:解析server端外层数据,并供详细解析类继承重写解析方法
     * @author gao_chun
     */
    public abstract class AbstractParser<T> implements IParser<Result<T>> {
    
        @Override
        public final Result<T> parse(String response) {
    	
            final Result<T> result = new Result<T>();	//创建Result类对象
    		
            if (response != null && response.length() > 0) {
    			
                final JSONObject jsonObject = JsonUtils.createJsonObject(response);	//将response的数据创建为JsonObject
    			
                if (jsonObject != null) {
    				//获得status、message、data数据
                    result.setStatus(JsonUtils.getStringInt(jsonObject, "status"));
                    result.setMessage(JsonUtils.getString(jsonObject, "message"));
                    final Object object = JsonUtils.getObject(jsonObject, "data");
    				//实现data进一步解析。泛型
                    if (object != null && (object instanceof JSONObject || object instanceof JSONArray)) {
                        T data = parseData(object);	//解析
                        result.setData(data);	//设置数据
                    } else {
                        result.setData(null);
                    }
                } else {
                    result.setStatus(Result.STATUS_JSON_ERROR);
                }
    
            } else {
                result.setStatus(Result.STATUS_RESPONSE_NULL_OR_EMPTY);
            }
            return result;
        }
    
    	//抽象解析方法,目的是为了让详细的解析类重写
        protected abstract T parseData(Object object);
    	
    }

    或许朋友就恍然大悟了,沃尼玛。原来是酱紫的啊。


    我们回过头来看看登录请求:

    private void login(String name,String pwd){  
    
            GenericDataManager mDataManager = GenericDataManager.getInstance();//通用网络管理类  
    		
            RequestParams mParams = RequestParameterFactory.getInstance().login(name, pwd);//请求參数管理类  
    		
            mDataManager.dataRequest(0,Constants.REQUEST.GET, RequestURL.URL_LOGIN, mParams,new ResultParser(), this);//运行网络请求  
        }  
    	

    dataRequest 中传入了 new ResultParser() 解析对象:

    public class ResultParser extends AbstractParser<Object> {
    
        /* (non-Javadoc)
         * @see app.backend.network.AbstractParser#parseData(java.lang.Object)
         */
        @Override
        public Object parseData(Object object) {
            return object;
        }

    这里要说明。若server端 data 中无返回数据。也就是说发出请求,若仅仅须要告诉我 success 或者 failed,那就直接传入new ResultParser() 解析器对象便可,在Activity的回调中,取出相应状态推断就可以:



    data 中存在返回数据须要解析。那么此时须要创建解析器,给个样例:

    //继承AbstractParser<T> 并在泛型中传入解析后的结果(集合或对象)
    public class WasherParser extends AbstractParser<List<NearbyWasher>> {
    
        @Override
        public List<NearbyWasher> parseData(Object object) {
    
            if (object != null) {
                return JSON.parseArray(object.toString(), NearbyWasher.class);
            }
            return null;
        }
    }

    JSON.parseArray() 方法是使用了阿里巴巴的fastJson。此处大家也能够使用Gson,或者使用Android自带Json工具解析。

    关于fastJson的使用,本人之前也总结了一篇博文可供大家參考。

    Android开发之怎样使用FastJson:http://blog.csdn.net/gao_chun/article/details/39232097

    继续给大家介绍 RequestParameterFactory ,该类的定义是封装了參数请求,如:


    可能有朋友会说,直接写在  private void login(String name,String pwd)  方法中不就能够了,何必再创建一个类呢?

    个人认为。这样定义出一个类的话,有便于管理,若需求改变,添加了某个字段,不须要到处在Activity中寻找,且项目层次结构清晰。个人愚见。


    这里还须要给大家介绍一个类 GlobalConfigManager,该类为本地配置管理。主要作用是读取serverip地址,比方我们的登录接口是:http://192.168.1.1:8080/WashCar/washer/login?name=yang&pwd=123。我们将前缀http://192.168.1.1:8080 写在AndroidManifest.xml文件的meta-data中,使用时在MainApplication中提前初始化:

        <application
            android:name="org.gaochun.ui.MainApplication"
            android:allowBackup="true"
            android:icon="@drawable/ic_launcher"
            android:label="@string/app_name"
            android:theme="@style/Theme.White.NoTitleBar" >
    
            <activity
                android:name="org.gaochun.activity.LoginActivity"
                android:label="@string/app_name" >
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
    
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
    
    <!--serverIP-->
            <meta-data
                android:name="app.server"
                android:value="http://192.168.1.1:8080" />
        </application>

    整个网络通讯架构大概就是这么回事了。整理了一下源代码。给大家共享学习。

    下篇博文打算给大家介绍res文件夹下界面开发中需注意的地方并共享源代码,感谢大家的关注,共同学习。


    源代码下载:http://download.csdn.net/download/gao_chun/8843515



    上门洗车APP --- Androidclient开发 之 项目结构介绍



    【注:转载注明gao_chun的BLOG http://blog.csdn.net/gao_chun/article/details/46655411

  • 相关阅读:
    MQTT的编译和安装(mosquitto)
    四、固件分析-固件逆向
    三、固件分析-固件提取
    二、硬件分析-电路分析
    一、硬件分析
    gdb调试
    AES加密中遇到的坑
    多线程中快速定位段错误位置
    理想的数据加密流程
    Centos进入单用户修改root密码
  • 原文地址:https://www.cnblogs.com/yangykaifa/p/7237980.html
Copyright © 2011-2022 走看看