okhttp和volley哪个好,retrofit,android-async-http,volley应该选择哪一个

okhttp,retrofit,android-async-http,volley应该选择哪一个? - 知乎1313被浏览79633分享邀请回答610 条评论分享收藏感谢收起今天看啥 热点:
Android 各大网络请求库的比较及实战,android请求库实战
自己学习android也有一段时间了,在实际开发中,频繁的接触网络请求,而网络请求的方式很多,最常见的那么几个也就那么几个。本篇文章对常见的网络请求库进行一个总结。
HttpUrlConnection
最开始学android的时候用的网络请求是HttpUrlConnection,当时很多东西还不知道,但是在android 2.2及以下版本中HttpUrlConnection存在着一些bug,所以建议在android 2.3以后使用HttpUrlConnection,之前使用HttpClient。
在Android 2.2版本之前,HttpClient拥有较少的bug,因此使用它是最好的选择。而在Android 2.3版本及以后,HttpURLConnection则是最佳的选择。它的API简单,体积较小,因而非常适用于Android项目。压缩和缓存机制可以有效地减少网络访问的流量,在提升速度和省电方面也起到了较大的作用。对于新的应用程序应该更加偏向于使用HttpURLConnection,因为在以后的工作当中我们也会将更多的时间放在优化HttpURLConnection上面。
比较轻便,灵活,易于扩展
在3.0后以及4.0中都进行了改善,如对HTTPS的支持
在4.0中,还增加了对缓存的支持
&uses-permission android:name="android.permission.INTERNET"
public String get(String urlPath) {
HttpURLConnection connection = null;
InputStream is = null;
URL url = new URL(urlPath);
connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("GET");
connection.setUseCaches(false);
connection.setConnectTimeout(10000);
connection.setReadTimeout(10000);
connection.setDoInput(true);
if (connection.getResponseCode() == HttpURLConnection.HTTP_OK) {
is = connection.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(is));
StringBuilder response = new StringBuilder();
while ((line = reader.readLine()) != null) {
response.append(line);
return response.toString();
} catch (Exception e) {
e.printStackTrace();
} finally {
if (connection != null) {
connection.disconnect();
connection = null;
if (is != null) {
is.close();
is = null;
} catch (IOException e) {
e.printStackTrace();
return null;
private String post(String urlPath, Map&String, String& params) {
if (params == null || params.size() == 0) {
return get(urlPath);
OutputStream os = null;
InputStream is = null;
HttpURLConnection connection = null;
StringBuffer body = getParamString(params);
byte[] data = body.toString().getBytes();
URL url = new URL(urlPath);
connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("POST");
connection.setUseCaches(false);
connection.setConnectTimeout(10000);
connection.setReadTimeout(10000);
connection.setDoInput(true);
connection.setDoOutput(true);
connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
connection.setRequestProperty("Content-Length", String.valueOf(data.length));
os = connection.getOutputStream();
os.write(data);
if (connection.getResponseCode() == HttpURLConnection.HTTP_OK) {
is = connection.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(is));
StringBuilder response = new StringBuilder();
while ((line = reader.readLine()) != null) {
response.append(line);
return response.toString();
} catch (Exception e) {
e.printStackTrace();
} finally {
if (os != null) {
os.close();
} catch (IOException e) {
e.printStackTrace();
if (is != null) {
is.close();
} catch (IOException e) {
e.printStackTrace();
if (connection != null) {
connection.disconnect();
connection = null;
return null;
private StringBuffer getParamString(Map&String, String& params) {
StringBuffer result = new StringBuffer();
Iterator&Map.Entry&String, String&& iterator = params.entrySet().iterator();
while (iterator.hasNext()) {
Map.Entry&String, String& param = iterator.next();
String key = param.getKey();
String value = param.getValue();
result.append(key).append('=').append(value);
if (iterator.hasNext()) {
result.append('&');
以上代码参考了部分LessCode项目
HttpClient
高效稳定,但是维护成本高昂,故android 开发团队不愿意在维护该库而是转投更为轻便的HttpUrlConnection
由于在android2.3之后就被HttpUrlConnection取代了,这里也不过多介绍了,不过当初学习它的时候还没接触到其他库,就感觉它好方便,下面简单贴出使用方法
private String get(String url){
HttpClient client=null;
HttpGet request=null;
client=new DefaultHttpClient();
request=new HttpGet(url);
HttpResponse response=client.execute(request);
if(response.getStatusLine().getStatusCode()== HttpStatus.SC_OK){
String result=EntityUtils.toString(response.getEntity(),"UTF-8");
} catch (IOException e) {
e.printStackTrace();
private String post(String url,List&NameValuePair& params){
HttpClient client=null;
HttpPost request=null;
client=new DefaultHttpClient();
request=new HttpPost(url);
request.setEntity(new UrlEncodedFormEntity(params, HTTP.UTF_8));
HttpResponse response=client.execute(request);
if(response.getStatusLine().getStatusCode()== HttpStatus.SC_OK){
String result=EntityUtils.toString(response.getEntity(),"UTF-8");
} catch (IOException e) {
e.printStackTrace();
以上代码参考了郭霖《第一行代码》——HttpClient部分
Android Asynchronous Http Client
Android Asynchronous Http Client一看名字就知道它是基于Http Client的,但是呢在安卓中Http Client已经废弃了,所以也不建议使用这个库了。然后仍然有一些可取的内容值得学习,所以这里也介绍一下。
所以请求在子线程中完成,请求回调在调用该请求的线程中完成
使用线程池
使用RequestParams类封装请求参数
支持文件上传
持久化cookie到SharedPreferences,个人感觉这一点也是这个库的重要特点,可以很方便的完成一些模拟登录
支持HTTP Basic Auth
编写一个静态的HttpClient
package cn.edu.zafu.
import com.loopj.android.http.AsyncHttpC
import com.loopj.android.http.AsyncHttpResponseH
import com.loopj.android.http.RequestP
* Created by lizhangqu on .
public class TestClient {
private static final String BASE_URL = "http://121.41.119.107/";
private static AsyncHttpClient client = new AsyncHttpClient();
public static void get(String url, RequestParams params, AsyncHttpResponseHandler responseHandler) {
client.get(getAbsoluteUrl(url), params, responseHandler);
public static void post(String url, RequestParams params, AsyncHttpResponseHandler responseHandler) {
client.post(getAbsoluteUrl(url), params, responseHandler);
private static String getAbsoluteUrl(String relativeUrl) {
return BASE_URL + relativeU
调用get或者post方法
参数通过RequestParams传递,没有参数则传递null
RequestParams
params = new RequestParams();
params.put("","");
如果要保存cookie,在发起请求之前调用以下代码
PersistentCookieStore myCookieStore = new PersistentCookieStore(this);
client.setCookieStore(myCookieStore);
之后请求所得到的cookie都会自动持久化
如果要自己添加cookie,则调用以下代码
BasicClientCookie newCookie = new BasicClientCookie("cookiesare", "awesome")
newCookie.setVersion(1)
newCookie.setDomain("")
newCookie.setPath("/")
myCookieStore.addCookie(newCookie)
在回调函数中处理返回结果
private void get(){
TestClient.get("test/index.php", null, new AsyncHttpResponseHandler() {
public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) {
public void onFailure(int statusCode, Header[] headers, byte[] responseBody, Throwable error) {
private void post(){
RequestParams params = new RequestParams();
params.put("user","asas");
params.put("pass","12121");
params.put("time","1212121");
TestClient.post("test/login.php", params, new AsyncHttpResponseHandler() {
public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) {
public void onFailure(int statusCode, Header[] headers, byte[] responseBody, Throwable error) {
以上代码参考了Android Asynchronous Http Client官方实例
既然在android2.2之后不建议使用Http Client,那么有没有一个库是android2.2及以下版本使用Http Client,而android2.3及以上版本使用HttpUrlConnection的呢,答案是肯定的,就是Volley,它是android开发团队在2013年Google I/O大会上推出了一个新的网络通信框架
Volley可以说是把AsyncHttpClient和Universal-Image-Loader的优点集于了一身,既可以像AsyncHttpClient一样非常简单地进行HTTP通信,也可以像Universal-Image-Loader一样轻松加载网络上的图片。除了简单易用之外,Volley在性能方面也进行了大幅度的调整,它的设计目标就是非常适合去进行数据量不大,但通信频繁的网络操作,而对于大数据量的网络操作,比如说下载文件等,Volley的表现就会非常糟糕
下面一步一步来学习其用法
private void get(){
RequestQueue queue= Volley.newRequestQueue(getApplicationContext());
String url="http://121.41.119.107/test/index.php";
StringRequest request=new StringRequest(url, new Response.Listener&String&() {
public void onResponse(String response) {
Log.d("TAG",response);
}, new Response.ErrorListener() {
public void onErrorResponse(VolleyError error) {
queue.add(request);
通过指定请求方法为Request.Method.POST使其成为post请求,然后重新getParams方法设置请求参数。当发出POST请求的时候,Volley会尝试调用StringRequest的父类——Request中的getParams()方法来获取POST参数
private void post() {
RequestQueue queue = Volley.newRequestQueue(getApplicationContext());
String url = "http://121.41.119.107/test/login.php";
StringRequest request = new StringRequest(Request.Method.POST, url, new Response.Listener&String&() {
public void onResponse(String response) {
Log.d("TAG", response);
}, new Response.ErrorListener() {
public void onErrorResponse(VolleyError error) {
protected Map&String, String& getParams() throws AuthFailureError {
Map&String, String& params = new HashMap&String, String&();
params.put("user", "asas");
params.put("pass", "12121");
params.put("time", "1212121");
return params;
queue.add(request);
加载图像的方法和前面类似,只不过不在是StringRequest而是ImageRequest。
private void getImage() {
RequestQueue queue = Volley.newRequestQueue(getApplicationContext());
String url = "/img/bdlogo.png";
ImageRequest request = new ImageRequest(url, new Response.Listener&Bitmap&() {
public void onResponse(Bitmap response) {
ImageView iv= (ImageView) findViewById(R.id.iv);
iv.setImageBitmap(response);
}, 0, 0, ImageView.ScaleType.CENTER, Bitmap.Config.ARGB_8888, new Response.ErrorListener() {
public void onErrorResponse(VolleyError error) {
queue.add(request);
其实加载图片的功能还远远不止这些,使用ImageLoader可以实现对图片的缓存,还可以过滤重复链接,避免发送重复的请求
ImageLoader的使用方法概括为以下几步
1. 创建一个RequestQueue对象。
2. 创建一个ImageLoader对象。
3. 获取一个ImageListener对象。
4. 调用ImageLoader的get()方法加载网络上的图片。
public class BitmapCache implements ImageLoader.ImageCache {
private LruCache&String, Bitmap& mC
public BitmapCache() {
int maxSize = 10 * 1024 * 1024;
mCache = new LruCache&String, Bitmap&(maxSize) {
protected int sizeOf(String key, Bitmap bitmap) {
return bitmap.getRowBytes() * bitmap.getHeight();
public Bitmap getBitmap(String url) {
return mCache.get(url);
public void putBitmap(String url, Bitmap bitmap) {
mCache.put(url, bitmap);
private void getImageByImageLoader() {
ImageView iv= (ImageView) findViewById(R.id.iv);
RequestQueue queue = Volley.newRequestQueue(getApplicationContext());
String url = "/img/bdlogo.png";
ImageLoader loader=new ImageLoader(queue,new BitmapCache() );
ImageLoader.ImageListener listener=ImageLoader.getImageListener(iv,R.mipmap.ic_launcher,R.mipmap.ic_launcher);
loader.get(url,listener);
最后,Volley提供了一种自定义ImageView来加载图片,其使用方法可概括为
1. 创建一个RequestQueue对象。
2. 创建一个ImageLoader对象。
3. 在布局文件中添加一个NetworkImageView控件。
4. 在代码中获取该控件的实例。
5. 设置要加载的图片地址。
我们在布局中申明该控件
&com.android.volley.toolbox.NetworkImageView
android:id="@+id/network_image_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
在程序中实现加载
public void networkImageView(){
RequestQueue queue = Volley.newRequestQueue(getApplicationContext())
ImageLoader loader=new ImageLoader(queue,new BitmapCache() )
NetworkImageView niv= (NetworkImageView) findViewById(R.id.network_image_view)
niv.setDefaultImageResId(R.mipmap.ic_launcher)
niv.setErrorImageResId(R.mipmap.ic_launcher)
niv.setImageUrl("/img/bdlogo.png",
自定义Request
在实际应用中,往往需要将http请求与json进行集成,而Volley正恰恰支持这样的方式,不过需要我们自己自定义Request,这里我们使用google的Gson库进行集成。
1. 继承Request类
2. 重写parseNetworkResponse,实现json与实体类转换,由于实体类未定,所以采用泛型
下文用到的json字符串如下
{"name":"lizhangqu","age":16}
package cn.edu.zafu.
import com.android.volley.NetworkR
import com.android.volley.ParseE
import com.android.volley.R
import com.android.volley.R
import com.android.volley.toolbox.HttpHeaderP
import com.google.gson.G
import java.io.UnsupportedEncodingE
* Created by lizhangqu on .
public class GsonRequest&T& extends Request&T& {
private final Response.Listener&T& mL
private Gson mG
private Class&T& mC
public GsonRequest(int method, String url, Class&T& clazz, Response.Listener&T& listener,
Response.ErrorListener errorListener) {
super(method, url, errorListener);
mGson = new Gson();
mListener =
public GsonRequest(String url, Class&T& clazz, Response.Listener&T& listener,
Response.ErrorListener errorListener) {
this(Method.GET, url, clazz, listener, errorListener);
protected Response&T& parseNetworkResponse(NetworkResponse response) {
String jsonString = new String(response.data,
HttpHeaderParser.parseCharset(response.headers));
return Response.success(mGson.fromJson(jsonString, mClass),
HttpHeaderParser.parseCacheHeaders(response));
} catch (UnsupportedEncodingException e) {
return Response.error(new ParseError(e));
protected void deliverResponse(T response) {
mListener.onResponse(response);
编写测试实体类,两个字段一个name一个age
package cn.edu.zafu.
* Created by lizhangqu on .
public class Person {
private int
public String getName() {
public void setName(String name) {
this.name =
public int getAge() {
public void setAge(int age) {
this.age =
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
调用方法和StringRequest是一样的。如下所示
private void json(){
RequestQueue queue = Volley.newRequestQueue(getApplicationContext());
String url = "http://121.41.119.107/test/index.php";
GsonRequest&Person& request=new GsonRequest&Person&(url, Person.class, new Response.Listener&Person&() {
public void onResponse(Person response) {
Log.d("TAG",response.toString());
}, new Response.ErrorListener() {
public void onErrorResponse(VolleyError error) {
queue.add(request);
以上代码参考了郭霖三篇Volley博客文章,分别为
Android Volley完全解析(一),初识Volley的基本用法
Android Volley完全解析(二),使用Volley加载网络图片
Android Volley完全解析(三),定制自己的Request
okhttp 是一个 Java 的 HTTP+SPDY 客户端开发包,同时也支持 Android。需要Android 2.3以上。
OKHttp是Android版Http客户端。非常高效,支持SPDY、连接池、GZIP和 HTTP 缓存。
默认情况下,OKHttp会自动处理常见的网络问题,像二次连接、SSL的握手问题。
如果你的应用程序中集成了OKHttp,Retrofit默认会使用OKHttp处理其他网络层请求。
从Android4.4开始HttpURLConnection的底层实现采用的是okHttp.
private String get(String url) {
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
Response response = null;
response = client.newCall(request).execute();
return response.body().string();
} catch (IOException e) {
e.printStackTrace();
return null;
POST需要使用RequestBody对象,之后再构建Request对象时调用post函数将其传入即可
private String post(String url) {
OkHttpClient client = new OkHttpClient();
RequestBody formBody = new FormEncodingBuilder()
.add("user", "Jurassic Park")
.add("pass", "asasa")
.add("time", "12132")
Request request = new Request.Builder()
.post(formBody)
Response response = null;
response = client.newCall(request).execute();
return response.body().string();
} catch (IOException e) {
e.printStackTrace();
return null;
此外,post的使用方法还支持文件等操作,具体使用方法有兴趣的可以自行查阅
对Gson的支持
okHttp还自带了对Gson的支持
private Person gson(String url){
OkHttpClient client = new OkHttpClient();
Gson gson = new Gson();
Request request = new Request.Builder()
Response response = null;
response = client.newCall(request).execute();
Person person = gson.fromJson(response.body().charStream(), Person.class);
} catch (IOException e) {
e.printStackTrace();
return null;
以上的两个例子必须在子线程中完成,同时okHttp还提供了异步的方法调用,通过使用回调来进行异步调用,然后okHttp的回调依然不在主线程中,因此该回调中不能操作UI
private void getAsync(String url) {
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
Response response = null;
client.newCall(request).enqueue(new Callback() {
public void onFailure(Request request, IOException e) {
public void onResponse(Response response) throws IOException {
String result = response.body().string();
Toast.makeText(getApplicationContext(),result,Toast.LENGTH_SHORT).show();
Log.d("TAG", result);
okHttp的使用还有很多内容,这里也不过多介绍,更多内容,参考官方网址
Retrofit支持同步和异步两种方式,在使用时,需要将请求地址转换为接口,通过注解来指定请求方法,请求参数,请求头,返回值等信息。还是使用之前的person的那段json值,get请求到服务器后从数据库查询数据,返回值为查询到的数据,post请求向服务器提交一条数据,返回值为提交的数据。
首先完成请求所用的service,是一个interface,完全通过注解完成配置
package cn.edu.zafu.
import retrofit.C
import retrofit.http.F
import retrofit.http.FormUrlE
import retrofit.http.GET;
import retrofit.http.H
import retrofit.http.POST;
import retrofit.http.P
import retrofit.http.Q
* Created by lizhangqu on .
public interface PersonService {
@Headers({
"Cache-Control: max-age=640000",
"User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko"
@GET("/{test}/rest.php")
Person getPerson(@Path("test") String dir,@Query("name") String name);
@FormUrlEncoded
@POST("/test/rest1.php")
Person updatePerson(@Field("name") String name,@Field("age") int age);
@POST("/test/rest1.php")
void updatePerson(@Field("name") String name,@Field("age") int age, Callback&Person& callback);
使用时,通过RestAdapter的实例获得一个接口的实例,其本质是动态代理,注意含有返回值的方法是同步的,不能UI线程中调用,应该在子线程中完成
RestAdapter restAdapter = new RestAdapter.Builder()
.setEndpoint("http://121.41.119.107")
PersonService personService=restAdapter.create(PersonService.class)
Person person=personService.getPerson("test","zhangsan")
Log.d("TAG",person.toString())
POST的调用同Get,获得adapter后获得一个代理对象,然后通过这个代理对象进行网络请求
Person person1=personService.updatePerson("lizhangqu", 12)
Log.d("TAG",person1.toString())
如果要使用异步请求,需要将接口中的方法返回值修改会void,再加入回调参数Callback,就如PersonService中第三个方法一样,请求完成后会回调该callback对象的success或者fail方法。
RestAdapter restAdapter = new RestAdapter.Builder()
.setEndpoint("http://121.41.119.107")
PersonService personService=restAdapter.create(PersonService.class);
personService.updatePerson("lizhangqu",23, new Callback&Person&() {
public void success(Person person, Response response) {
Log.d("TAG", person.toString());
public void failure(RetrofitError error) {
Retrofit的使用还有很多内容,剩下的就留给各位读者自行去发现了,而其官网页提供了及其详细的说明。下面提供官方网址
retrofit官网示例
这个库里面有很多精华的内容,建议各位仔细的阅读下官方的文档。
见之前写的一篇博文
RoboSpice:android异步网络库简单用法
网络请求库多种多样,最终其本质思想是一致的,要学会融汇贯通,还是要fucking the source code。由于本篇文章已经过长,所以图片的网络加载准备另开一篇博客进行整理。
相关搜索:
相关阅读:
相关频道:
Android教程最近更新NoHttp和OkHttp哪个好用,Volley和NoHttp哪个好用?
NoHttp 源码及Demo托管在Github欢迎大家Star:&
NoHttp是专门做Android网络请求与下载的框架,框架。
开这篇博客也是不得已,NoHttp和OkHttp哪个好用?Volley和OkHttp哪个好用?NoHttp和Volley哪个好用?随着NoHttp的崛起,问这个问题的人是越来越多了,所以干脆来开一篇博客了。
OkHttp, HttpURLConnection, HttpClient
OkHttp、HttpConnection、HttpClient这三个家伙是对java来说的,三者的api是Java和Android都可以用的(随着Android6.0删除了HttpClient后,Android也不能使用HttpClient封装的框架了)。它们都是在做socket层的事情,做Android的都知道,Android请求网络需要的子线程发起,然后用handler把结果发送到主线程。用这三个家伙必须在子线程请求,还要自己封装参数、请求头、下载、传文件云云。
NoHttp、Volley、AsyncHttp、xUtil
NoHttp、Volley、Async-Http、xUtil的http模块,这几个家伙才是Android专用的,是不能用在Java的,它们不是在socket层做事情,不用去理睬socket,而是在上面三个家伙的基础上衍生的框架。不论传参数,传文件,等都做了不同程度的封装。都可以在主线程直接调用,拿到结果后也可以直接更新UI。
那么最后再来说说前面说的区别。&NoHttp、Volley、Async-Http、xUtil是一个平面的,OkHttp、HttpClient、HttpClient是一个平面的,对比的时候应该是说NoHttp和Volley哪个好用,OkHttp和HttpClient哪个好用。
到底哪个好用?
如果要问NoHttp和Volley哪个好用,我推荐NoHttp,原因是NoHttp封装了:文件下载、断点续传、304缓存、302/303传参数、传文件、请求头、多文件上传、大文件上传、Cookie自动管理等多种功能,这些是Volley而没有,而且使用Volley需要我们去写很多代码做封装,而NoHttp直接可以用,不需再做二次开发,当然NoHttp的架构设计上是很方便开发做自己的封装的。
OkHttp和HttpURLConnection(HttpClient在Android6.0已完全弃用)之间,如果开发者自己封装自己的框架,我推荐OkHttp,这个框架也是Google官方推荐的。理由不在赘述,Google百度一大推。
NoHttp 源码及Demo托管在Github欢迎大家Star:&
作者:严振杰链接:/question//answer/好吧,我是NoHttp的作者,对于大家说的推广怎么怎么滴,比如在我的CSDN博客写教程啦,我的Github/NoHttp写ReadMe啦,我也建了关于Android QQ群供大家交流,这些都无可厚非吧。至于百度贴吧这个,当时就是提供一个供大家交流的平台,我后来也觉得确实没有必要,让大家不舒服的地方还清大家多多谅解下。总体上可能是因为自己做的确实不够好,在这里也给大家道个歉,sorry。看到大家的支持了,感谢大家。同时也感谢所有不理解我的人,正是因为你们的指点我才能给大家带来更好的东西。从你们身上学到了很多,也确实成长了不少,以后我会更加努力分享好的内容给大家,希望能继续和大家交流。
NoHttp好像是国内 严振杰写的网络请求框架,google上除了一个基本的使用文档http://www.oschina.net/p/nohttp 基本上找不到完整api和说明文档。
我用使用了NoHttp是因为之前用的Volley不支持session的持久化,所以用了Nohttp,总体上还是可以的,满足基本需求没问题,但是应该就技术支持上来说,比不了OkHttp。
NoHttp已经做得很不错了.我也是偶然机会看到了NoHttp然后调研了段时间之后在项目中使用了,我直接使用源码依赖,暂且不说 square公司 的那些产品,NoHttp已经足够足够满足日常的需求了,也没有很必要为了逼格去用什么Retrofit,最重要的一点是,NoHttp的源码写的很清晰,从发起请求到响应回调都很清晰,一看就明了,这里要为作者点个赞,这个作品作者肯定花了很多时间迭代,学习NoHttp的源码还能学到一些其他的干货,比如队列啊,线程同步之类的知识,最后还是那句,你喜欢你就用,不喜欢也别乱抨击别人的作品。
NoHttp的源码在这里:GitHub - Y0LANDA/NoHttp: 支持HTTP/HTTPS, 自动维持Cookie, 异步/同步请求, 大文件/多文件上传, 文件下载; 支持304缓存, 302/303重定向, 支持代理服务器.二者的区别如下:OkHttp、HttpURLConnection、HttpClient都是Java通用的,并且它们在做Socket相关的事。而NoHttp、Volley、AsyncHttp是在前面三者的基础上做的封装,支持异步请求,是只有Android才可以用的(如果有人非说不是,那就要修改不少源码在别的平台才能用)。而NoHttp同时支持异步和同步,大文件、多文件上传;Cookie的自动管理,实现了和浏览器一样的标准的Cookie协议;还有Http缓存,比如304缓存,NoHttp还提供了几种缓存模式,比如1 缓存使用缓存没缓存才请求网络,2 有网络请求网络没有网络就使用缓存,3 仅仅使用网络,4 仅仅使用缓存等等。支持队列,支持和Activity、Fragment声明周期联动取消请求,支持请求String、Bitmap、Json、JavaBean,可自定义扩展请求类型。
至于发展前景很明了了,NoHttp专门来做网络请求,不绑架开发者。NoHttp的Jar只有130k左右,没有使用第三方依赖,纯Android原生实现。NoHttp的底层默认使用的URLConnection,但是Android4.4之后系统不是内置了OkHttp吗?然后看源码后发现4.4以后的URLConnection使用OkHttp的接口去实现的,所以NoHttp想当然的就是很不错的选择。OkHttp还用说吗?大牛团队square出品,值得信赖。
阅读(...) 评论()

我要回帖

更多关于 okhttp和volley区别 的文章

 

随机推荐