上门洗车APP --- Android客户端开发 之 网络框架封装(二)

上门洗车APP --- Android客户端开发 之 网络框架封装(二)

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

上门洗车APP --- Android客户端开发 前言及业务简介

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

本篇接着给大家分享网络框架封装,相信感兴趣的朋友已经对上篇博文中的一些开源项目有了些许了解,这里继续为大家介绍关于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> 是个什么玩意呢 ?

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

图 一

图 二

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

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

/**
 * @author gao_chun
 *
 */
public class Result<T> {

    private int status;//服务器返回状态码
    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;

/**
 * 抽象解析类
 * 目的:解析服务器端外层数据,并供具体解析类继承重写解析方法
 * @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;
    }

这里要说明,若服务器端 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,该类为本地配置管理,主要作用是读取服务器ip地址,比如我们的登录接口是: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>

<!--服务器IP-->
        <meta-data
            android:name="app.server"
            android:value="http://192.168.1.1:8080" />
    </application>

整个网络通讯架构大概就是这么回事了,整理了一下源码,给大家共享学习。下篇博文打算给大家介绍res目录下界面开发中需注意的地方并共享源码,感谢大家的关注,共同学习。

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

@remark: 本系列Blog禁止转载

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-08-06 03:45:37

上门洗车APP --- Android客户端开发 之 网络框架封装(二)的相关文章

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

上门洗车APP --- Android客户端开发 之 网络框架封装介绍(一) 上篇文章中给大家简单介绍了一些业务,上门洗车APP --- Android客户端开发 前言及业务简介,本篇文章给大家介绍下网络框架,之前也了解过一些开源网络通讯架构,也大概看了一部分源码,比如Afinal.Volley.AndBase.Android-async-http等,感觉各自都有各自的优劣,自己也曾封装过一些简单的网络架构,感觉有很多地方需要注意和优化,这里就不贴出来献丑了,感兴趣的朋友可以去查阅学习上面所说的

上门洗车APP --- Android客户端开发 之 项目结构介绍

上门洗车APP --- Android客户端开发 之 项目结构介绍 前言 虽然公司项目较紧,但还是抽出时间给大家继续更新.     o_O"~ 感谢大家的关注,很高兴和大家共同学习.前面给大家分享了项目中的以下内容: 上门洗车APP --- Android客户端开发 前言及业务简介 上门洗车APP --- Android客户端开发 之 网络框架封装介绍(一) 上门洗车APP --- Android客户端开发 之 网络框架封装介绍(二) 之前有很多朋友私信过来说想打包一份源码学习,由于本项目也是还

上门洗车APP --- Android客户端开发 前言及业务简介

上门洗车APP --- Android客户端开发 前言及业务简介 最近有些小累,私自接了一个项目,利用空余时间在开发,也比较乏力,时间和精力上有时候分配不过来,毕竟公司的事情要忙,只能自己抽时间来完成了,男人嘛,累点好,舒服是留给死人的(套用了一句逼格的话,o_O"~). 项目目前还在开发中,接口的调试以及业务的分析,框架的搭建,客户端这边已进行的差不多了,明天端午节,先祝大家节日快乐,汗~,看了下时间,貌似博客写完发表已经是端午节了,好吧,咕嘟咕嘟...... 大晚上的也是睡不着,写写博客,总

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

上门洗车APP --- Androidclient开发 之 网络框架封装介绍(二) 前几篇博文中给大家介绍了一下APP中的基本业务及开发本项目使用的网络架构: 上门洗车APP --- Androidclient开发 前言及业务简单介绍 上门洗车APP --- Androidclient开发 之 网络框架封装介绍(一) 本篇接着给大家分享网络框架封装.相信感兴趣的朋友已经对上篇博文中的一些开源项目有了些许了解.这里继续为大家介绍关于GenericDataManager 通用网络管理类中的 data

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

上门洗车APP --- Androidclient开发 之 项目结构介绍 前言 尽管公司项目较紧,但还是抽空给大家继续更新. o_O"~ 欢迎大家的关注,非常高兴和大家共同学习.前面给大家分享了项目中的以下内容: 上门洗车APP --- Androidclient开发 前言及业务简介 上门洗车APP --- Androidclient开发 之 网络框架封装介绍(一) 上门洗车APP --- Androidclient开发 之 网络框架封装介绍(二) 之前有非常多朋友私信过来说想打包一份源代码学习

CSDN Android客户端开发(二):详解如何基于Java用Jsoup爬虫HTML数据

本文参考链接详细介绍如何使用Jsoup包抓取HTML数据,是一个纯java工程,并将其打包成jar包.希望了解如何用java语言爬虫网页的可以看下. 杂家前文就又介绍用HTTP访问百度主页得到html的string字符串,但html的文本数据如果不经过处理就是个文本字符串没有任何效果的.所谓的浏览器就是负责将文本的html"翻译"成看到的界面.在前文有介绍,这个csdn的客户端app分首页.业界.移动.研发.程序员.云计算五大类.以业界为例,http://news.csdn.net/ 

Android应用开发:网络工具——Volley(二)

引言 在Android应用开发:网络工具--Volley(一)中结合Cloudant服务介绍了Volley的一般使用方法.当中包括了两种请求类型StringRequest和JsonObjectRequest.一般的请求任务相信都能够通过他们完毕了,只是在千变万化的网络编程中,我们还是希望能够对请求类型.过程等步骤进行全然的把控.本文就从Volley源代码角度来分析一下.一个网络请求在Volley中是怎样运作的.也能够看作网络请求在Volley中的生命周期. 源头RequestQueue 在使用V

上门洗车App 竟然是块大肥肉!

http://www.leiphone.com/k-xiche-app-idea.html 打车App.租车App.防违规App我们见得多,但洗车App你一定没听过,之前在一次创业路演上碰到一个做上门洗车App的,下面的投资人很是不解,“给人上门洗车还要花时间做个App,价格却跟传统洗车店收的一样,这有利可图么?”跟那个创业者深聊过后才发现,上门洗车App这事,搞不好是个暴利行当. 笔者下载这个App试用了一下,抛开UI设计.抛开创意体验,直奔它的核心功能——预约洗车,填好手机号.车牌号.预约洗

Android应用经典主界面框架之二:仿网易新闻客户端、CSDN 客户端 (Fragment ViewPager)

第二种主界面风格则是以网易新闻.凤凰新闻以及新推出的新浪博客(阅读版)为代表,使用ViewPager+Fragment,即ViewPager里适配器里放的不是一般的View,而是Fragment.所以适配器不能继承PagerAdapter,而要继承FragmentPagerAdapter,这是在android.support.v4.app.FragmentPagerAdapter包里的.有点奇葩的是,FragmentPagerAdapter只在这个包里有,在android.app.*这个包下面么