今天来总结一下常用网络开源库的特点与简单用法。
AsyncHttp
Asynchttp 基于Apache HttpClient库;
特点:
1.异步网络请求,在匿名回调中处理响应,使用简单
2.使用线程池来管理并发的网络请求
3.永久的cookie保存,内部实现用的是Android的SharedPreferences
4.库很小,所有的一切只有60kb
5.自动智能的请求重连
6.内置Json解析用法:
AsyncHttpClient client = new AsyncHttpClient();
//永久保存cookie
PersistentCookieStore myCookieStore = new PersistentCookieStore(this);
client.setCookieStore(myCookieStore);
client.get(getAbsoluteUrl(url), params, responseHandler);
client.post(getAbsoluteUrl(url), params, responseHandler);
private AsyncHttpResponseHandler mHandler = new AsyncHttpResponseHandler() {
@Override
public void onSuccess(int statusCode, Header[] headers, byte[] responseBytes) {
}
@Override
public void onFailure(int arg0, Header[] arg1, byte[] arg2, Throwable arg3) {
}
};
Volley
Volley,谷歌在android2.2之后不建议使用Http Client,Volley在android2.2及以下版本使用Http Client,而android2.3
及以上版本使用HttpUrlConnection,它是android开发团队在2013年推出的,大小大概153KB;
- 特点:
1.特别适合数据量小,通信频繁的网络操作,异步网络请求
2.支持使用okhttp作为传输层
3.扩展性强。Volley 中大多是基于接口的设计,可配置性强
4.提供简便的图片加载工具
5.访问网络数据时直接开启固定个数线程访问网络
6.不支持 post 大数据,所以不适合上传文件
用法:
//创建一个RequestQueue对象。
RequestQueue mQueue = Volley.newRequestQueue(context);
//创建一个Request对象。
StringRequest stringRequest = new StringRequest(Method.POST, url, listener, errorListener) {
@Override
protected Map<String, String> getParams() throws AuthFailureError {
return params;
}
};
//设置请求时间
stringRequest.setRetryPolicy(new DefaultRetryPolicy(20 * 1000, 1, 1.0f));
//将Request对象添加到RequestQueue里面。
mQueue.add(stringRequest);
}
{
加载图片只需把StringRequest改为ImageRequest ,然后设置一些图片宽高 图片scaleType属性等参数
}
{
使用ImageLoader可以实现对图片的缓存
RequestQueue queue = Volley.newRequestQueue(getApplicationContext());
String url = "https://www.baidu.com/img/bdlogo.png";
ImageLoader loader=new ImageLoader(queue,new BitmapCache() );
// 第一个参数指定用于显示图片的ImageView控件
// 第二个参数指定加载图片的过程中显示的图片
// 第三个参数指定加载图片失败的情况下显示的图片
ImageLoader.ImageListener listener=ImageLoader.getImageListener(iv,R.mipmap.ic_launcher,R.mipmap.ic_launcher);
// 调用ImageLoader的get()方法来加载图片
// 第一个参数就是图片的URL地址
// 第二个参数则是刚刚获取到的ImageListener对象
// 如果想对图片的大小进行限制,也可以使用get()方法的重载,指定图片允许的最大宽度和高度,即通过第三第四个参数指定
loader.get(url,listener);
XUtils
XUtils 一个 Android 公共库框架,主要包括四个部分:View,Db, Http, Bitmap 四个模块,大小900KB左右;
- View 模块主要的功能是通过注解绑定 UI,资源,事件。
- Db 模块是一个数据库 orm 框架, 简单的语句就能进行数据的操作。
- Http 模块主要访问网络,支持同步,异步方式的请求,支持文件的下载。
- Bitmap 模块是加载图片以及图片的处理, 支持加载本地,网络图片。而且支持图片的内存和本地缓存。
- 特点:
1.通过HTTPclient请求网络,bitmap模块通过urlhttpconnection
2.支持大数据的请求,速度比volley稍快,扩展性低
3.通过开启线程池来管理线程
用法:
//get请求
HttpUtils util = new HttpUtils();
util.send(HttpRequest.HttpMethod.GET, "http://www.baidu.com", new RequestCallBack<Sting>() {
@Override
public void onSuccess(ResponseInfo<Sting> responseInfo) {
// TODO Auto-generated method stub
}
@Override
public void onFailure(HttpException error, String msg) {
// TODO Auto-generated method stub
}
});
//post请求:
HttpUtils httpUtils = new HttpUtils();
RequestParams params = new RequestParams();
params.addBodyParameter("CODE", "31");
httpUtils.send(HttpMethod.POST, Constants.URL_HOST, params, new RequestCallBack<String>() {
@Override
public void onFailure(HttpException arg0, String arg1) {
}
@Override
public void onSuccess(ResponseInfo<String> arg0) {
}
}
});
Okhttp
Okhttp 是一个 Java 的 HTTP+SPDY(SPDY是基于TCP的应用层协议,用以最小化网络延迟,提升网络速度) 客户端开发包,同时也支持 Android。需要Android 2.3以上。
- 特点:
1.是安卓版http客户端,非常高效,支持SDPY,GZIP和HTTP缓存
2.自动处理常见的网络问题,比如二次连接,SSL握手问题。
3.从4.4开始httpurlconnection的底层实现采用的是okhttp
4.支持json,通过回调进行异步操作
5. 基于 NIO (非阻塞式读取数据)和 Okio(基于 IO 和 NIO 基础上做的一个更简单、高效处理数据流的一个库)
用法:
//新建一个okhttpclient对象
OkHttpClient client = new OkHttpClient();
//通过Request.Builder方法新建一个request对象
Request request = new Request.Builder()
.url(url)
.build();
Response response = null;
try {
//调用request的newCall方法得到响应结果
response = client.newCall(request).execute();
return response.body().string();
} catch (IOException e) {
e.printStackTrace();
}
return null;
Retrofit
Retrofit 支持同步和异步两种方式,在使用时,需要将请求地址转换为接口,通过注解来指定请求方法,请求参数,请求头,返回值等信息;
Retrofit+okhttp+rxjava是现在常用的请求形式
特点:
1.性能最好,处理最快,速度上比volley更快
2.传输层默认使用okhttp
3.默认使用Gson用法:
//首先完成请求所用的service,是一个interface,完全通过注解完成配置
public interface GitHubService {
@GET("users/{user}/repos")
Call<List<Repo>> listRepos(@Path("user") String user);
}
//创建Retrofit实例
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("https://api.github.com/")
.build();
//得到GitHubService对象
GitHubService service = retrofit.create(GitHubService.class);
//调用接口方法
Call<List<Repo>> repos = service.listRepos("octocat");