家庭洗车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+线程模型,并封装实现了网络实现与业务逻辑分离的多线程网络框架,具有超时退出.多设备多事件注册 ...
随机推荐
- java中HashMap在多线程环境下引起CPU100%的问题解决(转)
最近项目中出现了Tomcat占用CPU100%的情况,原以为是代码中出现死循环,后台使用jstack做了dump,发现是系统中不合理使用HashMap导致出现了死循环(注意不是死锁). 产生这个死循环 ...
- 图像库---Image Datasets---OpenSift源代码---openSurf源代码
1.Computer Vision Datasets on the web http://www.cvpapers.com/datasets.html 2.Dataset Reference http ...
- 用XAML做网页!!—终结篇
原文:用XAML做网页!!-终结篇 迄今为止的设计都很顺利,但这次就不得不接触我前面所说的非常糟糕的流文档了,但在此之前先来把标题弄好: <Border BorderBrush="#6 ...
- CSS之box-sizing的用处简介
前几天才发现有 box-sizing 这么个样式属性.研究了一番感觉非常有意思, 通过指定容器的盒子模型类型,达到不同的展示效果 比如:当一个容器宽度定义为 width:100%; 之后.假设再添加 ...
- 初窥Linux 之 文件权限
一.用户与用户组 为了更好地理解文件权限,我们需要先有用户和用户组的概念.因为在Linux里面,任何一个文件都具有“User(用户).Group(用户组)及Others(其他用户)”3种身份的个别权限 ...
- uptime
linux uptime命令主要用于获取主机运行时间和查询linux系统负载等信息.uptime命令过去只显示系统运行多久.现在,可以显示系统已经运行了多长时间,信息显示依次为:现在时间.系统已经运行 ...
- wbadmin delete backup删除服务器旧的镜像备份
- WCF-001:WCF的发布
随着“云”时代的到来,“云”已经无处不在了.什么是“云”,无非就是利用互联网强大的功能建立多个服务器,然后再利用互联网的传输数据的特点将数据从某个服务器中读取出来或者将你的数据上传上去.当然这个服务器 ...
- windows azure Vm、cloud service、web application 如何选择可用的服务
windows azure 的web应用和虚拟机都经常用.我们经常把我们的网站部署上去.一般选择web应用或者开一个虚拟机.开一个虚拟机就会按照虚拟机的使用时间进行计费. 那么我们选择web部署在哪里 ...
- ZOJ 3734 LIKE vs CANDLE
题目意思:(13年长沙站的一道水DP,本人也去了,当时太水笔) 说俩个人竞争选票,每个人可以随机选择支持谁.每个人带有权重不同. 现在已经结束了投票阶段,你一个骇客 支持LIKE 你写了一个软件可以 ...