Android-Http-Example
Introduction: 集成了 android-async-http, volley, okhttp3 等网络请求框架,进一步封装抽象出统一的 post、get 接口等。方便底层直接切换网络库
Tags:
android-async-http-volley-okhttp3-网络请求-Android 网络请求的统一封装和调用.集成了 android-async-http, volley, okhttp3 等网络请求框架.可直接切换底层库.
1 简介
架构分层
总共分为三层:
- 网络请求调用层. app 统一调用该层接口和这层提供的回调,该层可以切换不同的网络请求库.
- 网络请求库封装层. 封装了开源的 Android 网络请求库请求对外提供的方法.
- 胶水层.负责调用层和封装层的连接.调用网络封装层的接口并将返回 responseHandler 转为调用层自定义的 responseHandler.
功能
- post get 请求
- cookie 功能
- 上传文件
- 下载文件
- 取消请求(页面销毁时可调用,防止页面销毁异步请求未取消而导致的 crash)
集成的第三方网络请求库
android-async-http
官网:http://loopj.com/android-async-http/
文档:https://loopj.com/android-async-http/doc/
注意点:
- 取消请求接口 cancelAllRequest,cancelRequest,cancelRequestByTag 都必须在 post,get 时加上参数 Context,否则 cancel 不起作用
volley
Git 地址:https://android.googlesource.com/platform/frameworks/volley
官网地址:https://developer.android.com/training/volley/index.html?hl=zh-cn
郭霖的 volley 解析:http://blog.csdn.net/guolin_blog/article/details/17482095
注意点:
- git clone 后选用 android-6.0.1_25 tag 的版本,用 master 最新的引入出错
- 将下载后的 volley 删除.git 目录和 src 下 test 目录,然后拷贝到项目目录中
- 修改项目 setting.gradle 添加":volley",并修改 volley 的 gradle 版本变为项目一样的版本,最好项目 app 添加 dependency 即引入 volley 成功
- volley 仅实现 post 和 get 请求,upload 和 download 未实现.(volley 不适合大数据下载文件下载等,因为 volley 会在 parse 过程中将数据缓存在内存中)
- volley cacelRequest 无 onCancel 事件触发
- volley 只能获取第一个 cookie,如果需要多个 cookie 参考此文章
okhttp3
官方地址: http://square.github.io/okhttp/
注意点:
2 项目结构
统一调用层
- MyHttp.java (调用入口)
- MyHttpJsonResponseHandler.java (请求回调 json 数据)
- MyHttpFileResponseHandler.java (文件下载回调)
android-async-http
- LibAsyncHttp.java (封装了 android-async-http 对外提供的接口)
- MyAsyncHttp.java (android-async-http 和 myhttp 之间连接层)
volley
- LibVolley.java (封装了 volley 的对外 post get 接口)
- LibVolleyResponseModel.java (volley 返回数据封住)
- LibVolleyJSONObjectRequest.java (volley 自定义的 request)
- MyVolley.java (volley 和 myhttp 之间连接层)
okhttp
- LibOkHttp.java (封装了 okhttp 的对外接口)
- MyOkHttp.java (okhttp 和 myhttp 之间连接层)
3 调用示例
//post 请求
private void doPostHttp() {
//文本参数
Map<String, String> params = new HashMap<String, String>();
params.put("uid", "111");
//post
MyHttp.doPost(this, "http://192.168.3.1/test_post.php", params, new MyHttpJsonResponseHandler() {
@Override
public void onSuccess(int statusCode, JSONObject response) {
Log.i("tsy", "onSuccess status code=" + statusCode + " response=" + response);
}
@Override
public void onFailure(int statusCode, String error_msg) {
Log.i("tsy", "onFailure status code=" + statusCode + " error_msg=" + error_msg);
}
@Override
public void onCancel() {
Log.i("myhttp", "request on cancel");
}
});
}
//get 请求
private void doGetHttp() {
//文本参数
Map<String, String> params = new HashMap<String, String>();
params.put("uid", "111");
//get
MyHttp.doGet(this, "http://192.168.3.1/test_post.php", params, new MyHttpJsonResponseHandler() {
@Override
public void onSuccess(int statusCode, JSONObject response) {
Log.i("tsy", "onSuccess status code=" + statusCode + " response=" + response);
}
@Override
public void onFailure(int statusCode, String error_msg) {
Log.i("tsy", "onFailure status code=" + statusCode + " error_msg=" + error_msg);
}
@Override
public void onCancel() {
Log.i("myhttp", "request on cancel");
}
});
}
//上传文件
private void doUpload() {
//文件参数
File file = new File(Environment.getExternalStorageDirectory() + "/girls/head/output_tmp2.jpg");
Map<String, File> files = new HashMap<String, File>();
files.put("avatar", file);
//upload
MyHttp.doUpload(this, "http://192.168.3.1/test_post.php", files, new MyHttpFileResponseHandler() {
@Override
public void onSuccess(int statusCode) {
Log.i("tsy", "onSuccess status code=" + statusCode);
}
@Override
public void onFailure(int statusCode, String error_msg) {
Log.i("tsy", "onFailure status code=" + statusCode + " error_msg=" + error_msg);
}
@Override
public void onProgress(long bytesWritten, long totalSize) {
Log.i("tsy", String.format("Progress %d from %d" +
" (%2.0f%%)", bytesWritten, totalSize, (totalSize > 0) ? (bytesWritten * 1.0 / totalSize) * 100 : -1));
}
@Override
public void onCancel() {
Log.i("tsy", "request on cancel");
}
});
}
//下载文件
private void doDownload() {
File file = new File(Environment.getExternalStorageDirectory() + "/girls/head/output_tmp2.jpg"); //下载后存储的 file 位置
MyHttp.doDownload(this, "http://192.168.3.1/head.jpg", file, new MyHttpFileResponseHandler() {
@Override
public void onSuccess(int statusCode) {
Log.i("tsy", "onSuccess status code=" + statusCode);
}
@Override
public void onFailure(int statusCode, String error_msg) {
Log.i("tsy", "onFailure status code=" + statusCode);
}
@Override
public void onProgress(long bytesWritten, long totalSize) {
Log.i("tsy", String.format("Progress %d from %d (%2.0f%%)", bytesWritten, totalSize, (totalSize > 0) ? (bytesWritten * 1.0 / totalSize) * 100 : -1));
}
@Override
public void onCancel() {
Log.i("tsy", "request on cancel");
}
});
}
//页面销毁关闭请求 防止 crash 建议放到 BaseActivity BaseFragrament 里面
@Override
protected void onDestroy() {
super.onDestroy();
MyHttp.cancelRequest(this); //页面退出 关闭所有请求
}