上门洗车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 实现即:
-
-
-
-
-
- public interface IRequestCallback {
-
- public void onRequestStart(int requestId);
-
- public void onRequestSuccess(int requestId,int statusCode,Result<?> result);
-
- public void onRequestError(int requestId,Throwable error);
-
- }
注:requestId 即请求 id,目的是为了区分哪一个请求,比如:一个 Activity 中需要有两次或更多次的请求,如何在回调中区分具体的哪一个请求呢?使用 requestId 区分便可。
只需要在 Activity 中实现该接口,实现具体方法,便可得到数据:
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- package org.gaochun.activity;
-
-
-
-
-
- public class LoginActivity extends TitleActivity implements IRequestCallback{
-
- public Context context;
-
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- context = this;
- initUI();
-
- }
-
- private void initUI() {
- setContentView(R.layout.activity_login);
- setTitle(R.string.text_login);
- }
-
-
- @Override
- public void onRequestStart(int requestId) {
-
- }
-
- @Override
- public void onRequestSuccess(int requestId, int statusCode, Result<?> result) {
-
- Log.i(TAG,result.getMessage()+"--"+result.getStatus()+"--"+result.getData());
-
- }
-
-
- @Override
- public void onRequestError(int requestId, Throwable error) {
-
- Log.e(TAG,error.getMessage());
-
- }
-
- }
有没有感觉还是挺简便的赶脚?说了那么多,下面我们来进一步配合代码进行了解。
之前博文介绍过,使用该框架两种方式:
第一种 是将 releases 包中的最新jar拷贝到应用的 libs 目录下
第二种 是将 library 里的项目源码拷贝到你应用的 src 目录下(这里采用的是第二种方式)
以下是AsyncHttpClient简单用法,即创建一个请求
- AsyncHttpClient client = new AsyncHttpClient();
- client.get("http://www.google.com", new AsyncHttpResponseHandler() {
- @Override
- public 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是什么玩意呢?
这个类是封装的一个通用数据请求类,下面给出这个类,结合注释大家可以了解学习:
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 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;
-
-
-
-
-
-
-
-
- public class GenericDataManager {
-
- private static final String TAG = GenericDataManager.class.getSimpleName();
-
- private static GenericDataManager sInstance;
- private final String mServerHost;
- private final Handler mHandler;
-
- private static AsyncHttpClient client;
-
-
-
- static{
- client = new AsyncHttpClient();
- client.setTimeout(6 * 1000);
- }
-
-
-
- public static GenericDataManager getInstance() {
- if (sInstance == null) {
- Log.e(TAG, "ConfigManager.initiate method not called in the application.");
- }
- return sInstance;
- }
-
-
- public static void initialize(Context applicationContext, String serverHost) {
- sInstance = new GenericDataManager(applicationContext, serverHost);
- }
-
-
- private GenericDataManager(Context applicationContext, String serverHost) {
-
-
- mHandler = new Handler(Looper.getMainLooper());
-
- mServerHost = serverHost;
- }
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- private RequestCallBack mRequestCallBack;
-
-
- 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() {
- @Override
- public void run() {
- mCallback.onRequestStart(requestId);
- }
- });
- }
-
-
-
- mRequestCallBack = new RequestCallBack() {
-
- @Override
- public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) {
-
- String data = new String(responseBody);
-
- final Result<T> result = mParser.parse(data);
- if (result != null) {
-
- mCallback.onRequestSuccess(requestId,statusCode,result);
- }
- }
-
- @Override
- public void onStart() {
- if (mCallback != null) {
- mCallback.onRequestStart(requestId);
- }
- }
-
- @Override
- public void onFailure(int statusCode, Header[] headers,
- byte[] responseBody, Throwable error) {
-
- if (mCallback != null) {
- mCallback.onRequestError(requestId,error);
- }
- }
- };
-
-
- 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> :-
-
-
-
-
-
-
-
-
-
- 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】
0 0