家庭洗车APP --- Androidclient开展 之 网络框架包介绍(一)
家庭洗车APP --- Android客户端开发 之 网络框架包介绍(一)
上篇文章中给大家简单介绍了一些业务。上门洗车APP --- Android客户端开发 前言及业务简单介绍,本篇文章给大家介绍下网络框架。之前也了解过一些开源网络通讯架构。也大概看了一部分源代码。比方Afinal、Volley、AndBase、Android-async-http等,感觉各自都有各自的优劣,自己也曾封装过一些简单的网络架构,感觉有非常多地方须要注意和优化。这里就不贴出来献丑了,感兴趣的朋友能够去查阅学习上面所说的那些开源项目,也能够查看之前整理的博客:Android开源框架(整理)进行相关学习。这里只是多介绍了。
本项目採用的通讯框架是 Android-async-http,之前也写过一篇文章对其进行简单的介绍过。android-async-http开源项目介绍及用法。大家能够简单的了解下,本项目中基于该架构对数据的请求訪问及数据结果的返回做了一系列的封装。
这里分享下我的思路和想法,和大家共同学习。对于发出的网络请求能够这样理解。Request ---> 包含(请求时,请求中,请求成功,请求失败。请求结束),而server响应成功后取到数据。对数据结果进行解析。存储等处理。主要的框架都是这样。个人认为此处不够完好,总感觉返回请求数据的地方能够再次处理,进一步进行优化。那该怎么样呢?
我是这样想的,发出请求后。获取的数据希望是已经解析完毕的数据,而不是从返回结果中再去解析。也就是说。请求完毕后已经将数据结果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; @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) {//onRequestStart
//此处能够显示Dialog
} @Override
public void onRequestSuccess(int requestId, int statusCode, Result<?> result) { //onRequestSuccess Log.i(TAG,result.getMessage()+"--"+result.getStatus()+"--"+result.getData());//数据打印 } @Override
public void onRequestError(int requestId, Throwable error) { //onRequestError 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是什么玩意呢?
这个类是封装的一个通用数据请求类,以下给出这个类,结合凝视大家能够了解学习:
/*******************************************************************************
*
* Copyright (c) Weaver Info Tech Co. Ltd
*
* DataManager
*
* app.backend.manager.DataManager.java
* 用来訪问server上的数据
*
* @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; //server地址前缀
private final Handler mHandler; //运行异步回调的Handler private 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());
// 初始化server地址
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() {
@Override
public void run() {
mCallback.onRequestStart(requestId);
}
});
} // else ignored //实例化回调对象
mRequestCallBack = new RequestCallBack() { @Override
public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) { String data = new String(responseBody); //获取数据结果
//Log.d(TAG,"server获取数据:"+data);
final Result<T> result = mParser.parse(data); //解析类
if (result != null) {
//return the requestId + statusCode + result
mCallback.onRequestSuccess(requestId,statusCode,result); //返回请求成功且解析完毕的数据回调
} // else ignored.
} @Override
public void onStart() {
if (mCallback != null) {
mCallback.onRequestStart(requestId);
} // else ignored
} @Override
public 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 --- Androidclient开展 之 网络框架包介绍(一)的更多相关文章
- 上门洗车APP --- Androidclient开发 之 网络框架封装介绍(二)
上门洗车APP --- Androidclient开发 之 网络框架封装介绍(二) 前几篇博文中给大家介绍了一下APP中的基本业务及开发本项目使用的网络架构: 上门洗车APP --- Androidc ...
- 上门洗车APP --- Androidclient开发 之 项目结构介绍
上门洗车APP --- Androidclient开发 之 项目结构介绍 前言 尽管公司项目较紧,但还是抽空给大家继续更新. o_O"~ 欢迎大家的关注,非常高兴和大家共同学习.前面给大家分 ...
- 9 个用于移动APP开发的顶级 JavaScript 框架【申明:来源于网络】
9 个用于移动APP开发的顶级 JavaScript 框架[申明:来源于网络] 地址:http://www.codeceo.com/article/9-app-javascript-framework ...
- 打开APP 04 | 网络通信:RPC框架在网络通信上更倾向于哪种网络IO模型? 2020-02-26 何小锋
打开APP 04 | 网络通信:RPC框架在网络通信上更倾向于哪种网络IO模型? 2020-02-26 何小锋
- iOS “智慧气象”APP中用到的第三方框架汇总
“智慧气象”是我最近在公司接手的项目,已经完成最新版本的更新并上架,在此分享下其中用到的第三方框架的使用. 应用地址:APP商店搜索“智慧气象” MJRefresh(下拉刷新)业界知名下拉刷新框架就不 ...
- Android中android-async-http开源网络框架的简单使用
android-async-http开源网络框架是专门针对Android在Apache的基础上构建的异步且基于回调的http client.所有的请求全在UI线程之外发生,而callback发生在创建 ...
- Android网络框架Volley(实战篇)
之前讲了ym—— Android网络框架Volley(体验篇),大家应该了解了volley的使用,接下来我们要看看如何把volley使用到实战项目里面,我们先考虑下一些问题: 从上一篇来看 mQu ...
- Android网络框架比较
今天,公司需要为一个安卓app选择一个合适的网络框架,具体我了解,主要的安卓网络框架有okhttp,retrofit,android-async-http,volley. 查找网上的资料,大致可以得到 ...
- 1、发布C++实现的TCP网络框架Khala
1.Khala简介 Khala(卡拉)是用C++实现的TCP网络框架.底层采用muduo网络库作为网络IO+线程模型,并封装实现了网络实现与业务逻辑分离的多线程网络框架,具有超时退出.多设备多事件注册 ...
随机推荐
- 一起来开发Android的天气软件(四)——使用Gson解析数据
离上一篇文章过去才4.5天,我们赶紧趁热打铁继续完毕该系列的天气软件的开发. 承接上一章的内容使用Volley实现网络的通信.返回给我们的是这一串Json数据{"weatherinfo&qu ...
- 控制台打印Hibernate的SQL语句显示绑定参数值
问题? 使用Hibernate提供的show_sql内置属性true只能输出类似于下面的SQL语句:Hibernate: insert into user(name,password) value ...
- Error与Exception的区别
错误和异常的区别(Error vs Exception) 错误和异常的区别(Error vs Exception) 今天面试问了这样一个问题,"Error" 和 "Exc ...
- 利用h5标签在网页上播放音乐
方案1: <embed src="等一分钟.mp3" id="aa"> <input type=button value=暂停 onclick ...
- JAVA命令参数详解
JAVA命令参数详解 JAVA命令详解 结构 说明 Java 和 OldJava JIT 选项 另请参阅 结构 java [ options ] class [ argument ... ] java ...
- poj2942 Knights of the Round Table,无向图点双联通,二分图判定
点击打开链接 无向图点双联通.二分图判定 <span style="font-size:18px;">#include <cstdio> #include ...
- ZOJ 2334(Monkey King-左偏树第一题)
Monkey King Time Limit: 10 Seconds Memory Limit: 32768 KB Once in a forest, there lived N aggre ...
- Windows Phone开发(17):URI映射
原文:Windows Phone开发(17):URI映射 前面在讲述导航的知识,也讲了控件,也讲了资源,样式,模板,相信大家对UI部分的内容应该有了很直观的认识了.那么今天讲什么呢?不知道大家在练习导 ...
- Windows Phone开发(13):如何规范用户的输入行为
原文:Windows Phone开发(13):如何规范用户的输入行为 很多时候,我们对用户的操作或输入做一定程度的限制,以避免发生不必要的异常或错误,因此,对一些特殊的类型,进行输入限制是很有必要的. ...
- C#新DataColumn类Type生成的方法类型参数
DataColumn有的需要等级Type构造类型的参数,如以下: // // 摘要: // 使用指定列名称和数据类型初始化 System.Data.DataColumn 类的新实例. // // 參数 ...