上门洗车APP --- Android客户端开发 之 网络框架封装介绍(一)
上门洗车APP --- Android客户端开发 之 网络框架封装介绍(一)
上篇文章中给大家简单介绍了一些业务,上门洗车APP --- Android客户端开发 前言及业务简介,本篇文章给大家介绍下网络框架,之前也了解过一些开源网络通讯架构,也大概看了一部分源码,比如Afinal、Volley、AndBase、Android-async-http等,感觉各自都有各自的优劣,自己也曾封装过一些简单的网络架构,感觉有很多地方需要注意和优化,这里就不贴出来献丑了,感兴趣的朋友可以去查阅学习上面所说的那些开源项目,也可以查看之前整理的博客:Android开源框架(整理)进行相关学习,这里不过多介绍了。
本项目采用的通讯框架是 Android-async-http,之前也写过一篇文章对其进行简单的介绍过,android-async-http开源项目介绍及使用方法,大家可以简单的了解下,本项目中基于该架构对数据的请求访问及数据结果的返回做了一系列的封装。
这里分享下我的思路和想法,和大家共同学习。对于发出的网络请求可以这样理解,Request ---> 包括(请求时,请求中,请求成功,请求失败,请求结束),而服务器响应成功后取到数据,对数据结果进行解析,存储等处理,基本的框架都是这样,个人觉得此处不够完善,总感觉返回请求数据的地方可以再次处理,进一步进行优化,那该怎么样呢?
我是这样想的,发出请求后,获取的数据希望是已经解析完成的数据,而不是从返回结果中再去解析,也就是说,请求完成后已经将数据结果Result进行了解析,返回的Result已经是可直接使用的对象。这样的话,整个请求解析就方便多了。
那么到底效果如何呢?我们来看如下的一个登录请求例子:
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);//执行网络请求}
只需要 3行代码 便可发起一个请求,那么具体在 Activity 中如何使用呢?我们向外抛了一个IRequestCallback请求响应回调接口,该接口提供了三个回调方法,供 Activity 实现即:
/*** IRequestCallback of Washer* 请求响应回调接口* @author gao_chun*/
public interface IRequestCallback {public void onRequestStart(int requestId);//开始请求public void onRequestSuccess(int requestId,int statusCode,Result<?> result);//请求成功,返回请求Id,状态响应码,数据结果(解析后的数据对象)public void onRequestError(int requestId,Throwable error);//请求错误}
注:requestId 即请求 id,目的是为了区分哪一个请求,比如:一个 Activity 中需要有两次或更多次的请求,如何在回调中区分具体的哪一个请求呢?使用 requestId 区分便可。
只需要在 Activity 中实现该接口,实现具体方法,便可得到数据:
/********************************************************************************* Copyright (c) Weaver Info Tech Co. Ltd** LoginActivity** app.ui.activity.LoginActivity.java* TODO: File description or class description.** @author: gao_chun* @since: 2015-6-23* @version: 1.0.0** @changeLogs:* 1.0.0: First created this class.*******************************************************************************/
package org.gaochun.activity;/*** @author gao_chun**/
public class LoginActivity extends TitleActivity implements IRequestCallback{public Context context;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);context = this;initUI();}private void initUI() {setContentView(R.layout.activity_login);setTitle(R.string.text_login);}@Overridepublic void onRequestStart(int requestId) {//onRequestStart//此处可以显示Dialog}@Overridepublic void onRequestSuccess(int requestId, int statusCode, Result<?> result) { //onRequestSuccessLog.i(TAG,result.getMessage()+"--"+result.getStatus()+"--"+result.getData());//数据打印}@Overridepublic void onRequestError(int requestId, Throwable error) { //onRequestErrorLog.e(TAG,error.getMessage());//请求失败,错误信息打印}}
有没有感觉还是挺简便的赶脚?说了那么多,下面我们来进一步配合代码进行了解。
之前博文介绍过,使用该框架两种方式:
第一种 是将 releases 包中的最新jar拷贝到应用的 libs 目录下
第二种 是将 library 里的项目源码拷贝到你应用的 src 目录下(这里采用的是第二种方式)
以下是AsyncHttpClient简单用法,即创建一个请求
AsyncHttpClient client = new AsyncHttpClient();
client.get("http://www.google.com", new AsyncHttpResponseHandler() {@Overridepublic void onSuccess(String response) {System.out.println(response);}
});
注:该框架可执行多种网络请求,包括 get、put、post、head、delete 。有关不同请求的介绍,大家不了解的可以去查阅资料了解相关差异,这里就不介绍了。
我们就是对 AsyncHttpClient类进行了处理,上面执行请求时有出现这两行代码:
GenericDataManager mDataManager = GenericDataManager.getInstance();//通用网络管理类mDataManager.dataRequest(0,Constants.REQUEST.GET, RequestURL.URL_LOGIN, mParams,new ResultParser(), this);//执行网络请求
GenericDataManager是什么玩意呢?
这个类是封装的一个通用数据请求类,下面给出这个类,结合注释大家可以了解学习:
/********************************************************************************* Copyright (c) Weaver Info Tech Co. Ltd** DataManager** app.backend.manager.DataManager.java* 用来访问服务器上的数据** @author: gao_chun* @since: Jul 23, 2014* @version: 1.0.0** @changeLogs:* 1.0.0: First created this class.*******************************************************************************/
package org.gaochun.android.http.manager;import java.io.File;import org.apache.http.Header;
import org.gaochun.android.http.AsyncHttpClient;
import org.gaochun.android.http.RequestParams;
import org.gaochun.android.http.network.IRequestCallback;
import org.gaochun.android.http.network.RequestCallBack;
import org.gaochun.model.Result;
import org.gaochun.parser.AbstractParser;
import org.gaochun.utils.Log;import android.content.Context;
import android.os.Handler;
import android.os.Looper;/*** @author gao_chun* 通用数据通讯类,不涉及认证与授权的数据。* 这个类的任务:通过相应参数,获取数据对象。* 这个类不会涉及到URL地址。*/
public class GenericDataManager {private static final String TAG = GenericDataManager.class.getSimpleName();private static GenericDataManager sInstance;private final String mServerHost; //服务器地址前缀private final Handler mHandler; //执行异步回调的Handlerprivate static AsyncHttpClient client; //AsyncHttpClient对象// 设置超时时间static{client = new AsyncHttpClient(); //初始化AsyncHttpClient对象client.setTimeout(6 * 1000); //设置超时时间(重要)}//单例public static GenericDataManager getInstance() {if (sInstance == null) {Log.e(TAG, "ConfigManager.initiate method not called in the application.");} // else ignored.return sInstance;}//需要在Application中初始化public static void initialize(Context applicationContext, String serverHost) {sInstance = new GenericDataManager(applicationContext, serverHost);}private GenericDataManager(Context applicationContext, String serverHost) {// 初始化Handler,用于在主线程中执行任务mHandler = new Handler(Looper.getMainLooper());// 初始化服务器地址mServerHost = serverHost;}/*** 该方法封装了网络数据请求和数据解析* 并传入回调接口* @param requestId 请求ID* @param requestType 请求类型(此处根据传入的常量只提供了get请求和post请求)* @param urlString 请求URL* @param mParams 请求参数* @param parser 通用数据解析抽象解析器* @param mCallback 自定义接口回调*/private RequestCallBack mRequestCallBack; //该抽象类继承了AsyncHttpResponseHandler,并重写了回调方法public <T> void dataRequest(final int requestId,String requestType,String urlString,RequestParams mParams,final AbstractParser<T> mParser,final IRequestCallback mCallback){Log.i(TAG,"url:--->"+mServerHost + File.separator + urlString);//请求数据开始之前的回调if (mCallback != null) {mHandler.post(new Runnable() {@Overridepublic void run() {mCallback.onRequestStart(requestId);}});} // else ignored//实例化回调对象mRequestCallBack = new RequestCallBack() {@Overridepublic void onSuccess(int statusCode, Header[] headers, byte[] responseBody) {String data = new String(responseBody); //获取数据结果//Log.d(TAG,"服务器获取数据:"+data);final Result<T> result = mParser.parse(data); //解析类if (result != null) {//return the requestId + statusCode + resultmCallback.onRequestSuccess(requestId,statusCode,result); //返回请求成功且解析完成的数据回调} // else ignored.}@Overridepublic void onStart() {if (mCallback != null) {mCallback.onRequestStart(requestId);} // else ignored}@Overridepublic void onFailure(int statusCode, Header[] headers,byte[] responseBody, Throwable error) {if (mCallback != null) {mCallback.onRequestError(requestId,error);} // else ignored}};//根据传入的 requestType 来switch具体的请求方式(注:JDK1.7中switch()支持字符串常量)switch (requestType) {case Constants.REQUEST.GET:client.get(mServerHost + File.separator + urlString, mParams,mRequestCallBack);break;case Constants.REQUEST.POST:client.post(mServerHost + File.separator + urlString, mParams,mRequestCallBack);break;default:client.get(mServerHost + File.separator + urlString, mParams,mRequestCallBack);break;}}}
我们需要注意的是该方法中传入的参数,且使用了泛型 <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)
将请求参数,请求类型,请求URL,解析器,回调,传入这个方法中进行处理,回调成功直接取数据
如果项目中需要用到头像上传,下载 等功能, Android-async-http 项目中已经提供了对应的方法,大家可以自己在该类中封装方法。
忙里偷闲的挤时间整理了这篇文章,目的是先给大家简单的介绍框架的使用,让感兴趣的朋友有所了解,下篇博文中会给大家详细介绍dataRequest中的抽象解析类 及 请求参数封装 RequestParameterFactory类,当然也需要整理好源码后给大家共享学习。
如果觉得有需要改进的地方或者好的想法,欢迎大家发表意见。
上门洗车APP --- Android客户端开发 前言及业务简介
上门洗车APP --- Android客户端开发 之 网络框架封装介绍(一)
上门洗车APP --- Android客户端开发 之 网络框架封装介绍(二)
上门洗车APP --- Android客户端开发 之 项目结构介绍
【注:转载注明gao_chun的BLOG http://blog.csdn.net/gao_chun/article/details/46610555】
上门洗车APP --- Android客户端开发 之 网络框架封装介绍(一)相关推荐
- Android客户端开发—开源数据库框架LitePal
LitePal是一款开源的Android数据库框架,采用对象关系映射(ORM)模式,将常用的数据库功能进行封装,不使用SQL语句就可以完成创建表以及表单的CRUD操作,并且很轻量级,几乎零配置.(它将 ...
- Android应用开发:网络编程-2
网络编程 Java基础:网络编程 Uri.URL.UriMatcher.ContentUris详解 Android应用开发:网络编程1 Android应用开发:网络编程2 1. 使用HttpClien ...
- Android应用开发:网络编程-1
网络编程 Java基础:网络编程 Uri.URL.UriMatcher.ContentUris详解 Android应用开发:网络编程1 Android应用开发:网络编程2 1. 请求网络图片 网络交互 ...
- Android之---项目开发中网络框架的选择
项目开发中网络框架的选择 Android常用的网路框架: 大多数应用程序基本都需要连接网络,发送一些数据给服务端,或者从服务端获取一些数据.通常在 Android 中进行网络连接一般使用 Scoket ...
- 行代码入门python_新浪微博Android客户端开发视频教程(36讲)
教程名称:新浪微博Android客户端开发视频教程(36讲) 课程目录: [IT教程网]新浪微博Android客户端介绍 [IT教程网]新浪微博Android客户端相关资料 [IT教程网]新浪微博An ...
- android 腾讯微博授权,5腾讯微博Android客户端开发获取请求用户授权Request Token.pdf...
腾讯微博Android客户端开发 博客:/coolszy Android Android 腾讯微博AAnnddrrooiidd客户端开发 RequestToken RequestToken --获取请 ...
- 上门洗车小程序软件开发所需要的功能有哪些呢?
相信很多企业及投资者都想开发一款属于自己的小程序系统.那么一款专业好用的上门洗车小程序软件开发所需要的功能有哪些呢? 1. 用户注册与登录. 用户可以通过手机号码或微信账号 ...
- 快速接入 Android BLE 开发的基础框架
代码地址如下: http://www.demodashi.com/demo/12092.html * Android BLE基础操作框架,基于回调,操作简单.包含扫描.多连接.广播包解析.服务读写及通 ...
- Android AR开发实践之一:AR介绍
Android AR开发实践之一:AR介绍 一.什么是AR 二.AR的发展历程 三.AR的应用场景 四.AR技术面临的主要问题 五.AR平台简介 一.什么是AR AR(Augmented Realit ...
最新文章
- 创建 OVS vlan101 并部署 instance - 每天5分钟玩转 OpenStack(139)
- android实践项目一实现简单的验证码和spinner下拉选项效果
- Docker创建 tomcat/weblogic 集群
- ensure函数_webpack的require.ensure()
- 让你此生难成大器的七宗罪
- 【转】 C#泛型集合—Dictionary使用技巧
- 重庆北大青鸟校区【学员心声】:学习是我们前进的动力
- IPS(入侵防御系统)技术
- 立创EDA能代替传统的PCB设计软件么?比如AD、protel等?可以
- python爬虫爬取链家二手房信息
- 让手机支持OTG,不看绝对后悔! - 我也做一回搬运工,解决RFID读卡器OTG支持问题
- 计算机cs怎么使用技巧,CS里的fps设置方法(显卡篇)
- 积分球辐射光源照度均匀性
- 本地计算机上的MySQL服务启动后停止。某些服务在未由其他服务或程序使用时将自动停止.
- 创业结束后三年 我当员工的心得(翻译版本)
- python中的一个好用的文件名操作模块glob
- RedHat 全部镜像
- 动画讲算法,终于来了!
- 35+程序员该怎么办?有哪些破局方法?
- 解决:Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
热门文章
- 用ajax提交表单给数据库,如何利用ajax提交form表单到数据库
- cadence SPB17.4 - allegro - modify shape
- @Validated用法
- ASP.NET+SQL通用作业批改系统设计(源代码+论文)
- mysql mysqladmin 启动_mysqladmin客户端(windows环境)的用法
- C#编写定制的HID调试助手
- 【Python爬虫】爬取斗鱼直播信息(Fiddler抓包分析)
- sql avg后保留两位小数
- DataWei免费的报表工具,大数据可视化平台
- ImageIO读取图片出现一层红色背景解决方案