① 为什么okhttpclient不能builder
一、概述最近在群里听到各种讨论okhttp的话题,可见okhttp的口碑相当好了。再加上Google貌似在6.0版本里面删除了HttpClient相关API,对于这个行为不做评价。为了更好的在应对网络访问,学习下okhttp还是蛮必要的,本篇博客首先介绍okhttp的简单使用,主要包含:一般的get请求一般的post请求基于Http的文件上传文件下载加载图片支持请求回调,直接返回对象、对象集合支持session的保持最后会对上述几个功能进行封装,完整的封装类的地址见:https://github.com/hongyangAndroid/okhttp-utils使用前,对于Android Studio的用户,可以选择添加:compile 'com.squareup.okhttp:okhttp:2.4.0'1或者Eclipse的用户,可以下载最新的jar okhttp he latest JAR ,添加依赖就可以用了。注意:okhttp内部依赖okio,别忘了同时导入okio:gradle: compile 'com.squareup.okio:okio:1.5.0'最新的jar地址:okio the latest JAR二、使用教程(一)Http Get对了网络加载库,那么最常见的肯定就是http get请求了,比如获取一个网页的内容。//创建okHttpClient对象OkHttpClient mOkHttpClient = new OkHttpClient();//创建一个Requestfinal Request request = new Request.Builder() .url("https://github.com/hongyangAndroid") .build();//new callCall call = mOkHttpClient.newCall(request); //请求加入调度call.enqueue(new Callback() { @Override public void onFailure(Request request, IOException e) { } @Override public void onResponse(final Response response) throws IOException { //String htmlStr = response.body().string(); } }); 以上就是发送一个get请求的步骤,首先构造一个Request对象,参数最起码有个url,当然你可以通过Request.Builder设置更多的参数比如:header、method等。然后通过request的对象去构造得到一个Call对象,类似于将你的请求封装成了任务,既然是任务,就会有execute()和cancel()等方法。最后,我们希望以异步的方式去执行请求,所以我们调用的是call.enqueue,将call加入调度队列,然后等待任务执行完成,我们在Callback中即可得到结果。看到这,你会发现,整体的写法还是比较长的,所以封装肯定是要做的,不然每个请求这么写,得累死。ok,需要注意几点:onResponse回调的参数是response,一般情况下,比如我们希望获得返回的字符串,可以通过response.body().string()获取;如果希望获得返回的二进制字节数组,则调用response.body().bytes();如果你想拿到返回的inputStream,则调用response.body().byteStream()看到这,你可能会奇怪,竟然还能拿到返回的inputStream,看到这个最起码能意识到一点,这里支持大文件下载,有inputStream我们就可以通过IO的方式写文件。不过也说明一个问题,这个onResponse执行的线程并不是UI线程。的确是的,如果你希望操作控件,还是需要使用handler等,例如:@Overridepublic void onResponse(final Response response) throws IOException{ final String res = response.body().string(); runOnUiThread(new Runnable() { @Override public void run() { mTv.setText(res); } });}1234567891011121314我们这里是异步的方式去执行,当然也支持阻塞的方式,上面我们也说了Call有一个execute()方法,你也可以直接调用call.execute()通过返回一个Response。(二) Http Post 携带参数看来上面的简单的get请求,基本上整个的用法也就掌握了,比如post携带参数,也仅仅是Request的构造的不同。Request request = buildMultipartFormRequest( url, new File[]{file}, new String[]{fileKey}, null);FormEncodingBuilder builder = new FormEncodingBuilder(); builder.add("username","张鸿洋");Request request = new Request.Builder() .url(url) .post(builder.build()) .build(); mOkHttpClient.newCall(request).enqueue(new Callback(){});12345678910大家都清楚,post的时候,参数是包含在请求体中的;所以我们通过FormEncodingBuilder。添加多个String键值对,然后去构造RequestBody,最后完成我们Request的构造。后面的就和上面一样了。(三)基于Http的文件上传接下来我们在介绍一个可以构造RequestBody的Builder,叫做MultipartBuilder。当我们需要做类似于表单上传的时候,就可以使用它来构造我们的requestBody。File file = new File(Environment.getExternalStorageDirectory(), "balabala.mp4");RequestBody fileBody = RequestBody.create(MediaType.parse("application/octet-stream"), file);RequestBody requestBody = new MultipartBuilder() .type(MultipartBuilder.FORM) .addPart(Headers.of( "Content-Disposition", "form-data; name=\"username\""), RequestBody.create(null, "张鸿洋")) .addPart(Headers.of( "Content-Disposition", "form-data; name=\"mFile\"; filename=\"wjd.mp4\""), fileBody) .build();Request request = new Request.Builder() .url("http://192.168.1.103:8080/okHttpServer/fileUpload") .post(requestBody) .build();Call call = mOkHttpClient.newCall(request);call.enqueue(new Callback(){ //…});2526上述代码向服务器传递了一个键值对username:张鸿洋和一个文件。我们通过MultipartBuilder的addPart方法可以添加键值对或者文件。其实类似于我们拼接模拟浏览器行为的方式,如果你对这块不了解,可以参考:从原理角度解析Android (java) http 文件上传ok,对于我们最开始的目录还剩下图片下载,文件下载;这两个一个是通过回调的Response拿到byte[]然后decode成图片;文件下载,就是拿到inputStream做写文件操作,我们这里就不赘述了。关于用法,也可以参考泡网OkHttp使用教程接下来我们主要看如何封装上述的代码。三、封装由于按照上述的代码,写多个请求肯定包含大量的重复代码,所以我希望封装后的代码调用是这样的附上出处链接:http://blog.csdn.net/lmj623565791/article/details/47911083
② Android通过OKhttp从服务器端获取数据
①简单的异步Get请求第一步,创建OKHttpClient对象第二步,创建Request请求第三步,创建一个Call对象第四步,将请求添加到调度中不多说,直接上代码:12345678910111213141516171819202122232425262728293031//okHttp的基本使用 — get方法String url = "https://api.douban.com/v2/movie/top250?start=0&count=10";//1,创建OKHttpClient对象OkHttpClient mOkHttpClient = new OkHttpClient();//2,创建一个RequestRequest request = new Request.Builder().url(url).build();//3,创建一个call对象Call call = mOkHttpClient.newCall(request);//4,将请求添加到调度中call.enqueue(new Callback() {@Overridepublic void onFailure(Request request, IOException e) {}@Overridepublic void onResponse(Response response) throws IOException {if (response.isSuccessful()) {final String message = response.body().string();handler.post(new Runnable() {@Overridepublic void run() {tv_message.setText(message);progressBar.setVisibility(View.GONE);}});}}});
③ Android客户端访问网络时,volley与okHttp,哪一个更好
OkHttp物理质量使用OkHttp需要 okio.jar (80k), okhttp.jar(330k)这2个jar包,总大小差不多400k,加上自己的封装,差不多得410k。功能介绍Square 公司开源的 OkHttp 是一个专注于连接效率的 HTTP 客户端。OkHttp 提供了对 HTTP/2 和 SPDY 的支持,并提供了连接池,GZIP 压缩和 HTTP 响应缓存功能。优点支持http请求,https请求。支持文件下载。使用的是HttpURLConnection,不要担心android版本的变换。(至少目前是都支持的)。支持get,post请求。基于Http的文件上传。加载图片。缺点比如callback回来是在线程里面, 不能刷新UI,需要我们手动处理。封装比较麻烦。Volley物理质量使用Volley 需要Volley.jar(120k),加上自己的封装最多140k。功能简述Volley是Goole在2013年Google I/O大会上推出了一个新的网络通信框架,它是开源的。Volley 的特点:特别适合数据量小,通信频繁的网络操作。优点非常适合进行数据量不大,但通信频繁的网络操作。内部分装了异步线程。支持get,post网络请求。图片下载。可直接在主线程调用服务端并处理返回结果。可以取消请求,容易扩展,面向接口编程。缺点对大文件下载 Volley的表现非常糟糕。只支持http请求。在BasicNetwork中判断了statusCode(statusCode < 200 || statusCode > 299),如果合条件直图片加载性能一般。使用的是httpclient,HttpURLConnection。不过在android 6.0不支持httpclient了,如果想支持得添加org.apache.http.legacy.jar。总结在我们当前的项目 xxxSDK,xxx商城里面,使用volley就可以了,毕竟经过了日活几十万的测试,至少稳定性是没有问题的。okhttp暂时还用不上。后续如果要使用okhttp,可以再深入okhttp,给项目做重构。 不过既然转战Android studio,网络请求还是推荐使用Retrofit2Retrofit 是在OkHttp上封装的,可以参考下 Volley vs Retrofit http://blog.csdn.net/hwz2311245/article/details/46845271
④ 如何高效的使用Okhttp
首先okhttp是个http请求框架,所以要对http协议有一定的了解了。其次了解get,post,表单,上传下载文件之类的api。
⑤ okhttp3使用详解get怎么传参数
kHttp 可以做很多事,包括上传字符串、上传文件、上传流、上传表格参数、上传多部分的请求、响应 Json、响应缓存等。目前主要流行 Json 数据通信,所以我们就来讲讲基于 Json 通信的 GET 和 POST 请求与响应。2 下载 OkHttp介绍了这么多理论知识,接下来就进入实战阶段了,首先下载 OkHttp 的 jar 包,可以去 GitHub 下载最近的包。这是最新下载地址:https://search.maven.org/remote_content?g=com.squareup.okhttp3&a=okhttp&v=LATEST 当然,你也可以在项目中直接添加编译(用于 Android Studio):compile 'com.squareup.okhttp3:okhttp:3.2.0' OkHttp 的项目地址:https://github.com/square/okhttp除此之外,还需要添加一个 OkHttp 的依赖包:okio.jar,下载地址:https://search.maven.org/remote_content?g=com.squareup.okio&a=okio&v=LATEST 项目地址:https://github.com/square/okio 编译地址:compile 'com.squareup.okio:okio:1.6.0'3 GET 请求我们从最简单的 Http 请求开始学起,首先需要获取一个 OkHttpClient 对象,方法如下:[java] view plain print?
⑥ Okhttp解析(五)缓存的处理
大家好,之前我们讲解了Okhttp网络数据请求相关的内容,这一节我们讲讲数据缓存的处理。本节按以下内容讲解Okhttp缓存相关的内容。
缓存的使用场景很多,通过它可以将数据通过一定的规则存储起来,再次请求数据的时候就可以快速从缓存中读取了,缓存有以下优势。
HTTP本身提供了一套缓存相关的机制。这套机制定义了相关的字段和规则,用来客户端和服务端进行缓存相关的协商,如响应的数据是否需要缓存,缓存有效期,缓存是否有效,服务器端给出指示,而客户端则根据服务端的指示做具体的缓存更新和读取缓存工作。http缓存可以分为两类:
强制缓存,在缓存数据未失效的情况下,可以直接使用缓存数据,有两个字段Expires和Cache-Control用于标明失效规则。
表示过期时间,由服务端返回。那么下次请求数据时,判断这个Expires过期时间是否已经过了,如果还没有到过期时间,则使用缓存,如果过了过期时间,则重新请求服务器的数据。Expires格式如下:
不过因为服务器和客户端的时间并不是同步的,用一个绝对时间作为过期的标记并不是很明智,所以HTTP1.1之后更多的是Cache-Control,它的控制更加灵活。
表示缓存的控制,有服务端返回。它有以下几个取值:
默认情况下是private,也就是不能共享的。Cache-Control格式如下:
对比缓存,表示需要和服务端进行相关信息的对比,由服务器决定是使用缓存还是最新内容,如果服务器判定使用缓存,返回响应吗304,判定使用最新内容,则返回响应码200和最新数据。对比缓存的判定字段有两组:
ETag表示资源的一种标识信息,用于标识某个资源,由服务端返回,优先级更高。格式如下:
然后客户端再次请求时,加入字段If-None-Match,格式如下:
服务端收到请求的该字段时(之前的Etag值),和资源的唯一标识进行对比,如果相同,说明没有改动,则返回状态码304,如果不同,说明资源被改过了,则返回状态码200和整个内容数据。
Last-Modified表示资源的最近修改时间,由服务端返回,优先级更低。格式如下:
Last-Modified 由服务器返回,表示响应的数据最近修改的时间。 If-Modified-Since 由客户端请求,表示询问服务器这个时间是不是上次修改的时间。如果服务端该资源的修改时间小于等于If-Modified-Since指定的时间,说明资源没有改动,返回响应状态码304,可以使用缓存。如果服务端该资源的修改时间大于If-Modified-Since指定的时间,说明资源又有改动了,则返回响应状态码200和最新数据给客户端,客户端使用响应返回的最新数据。
Last-Modified字段的值(服务端返回的资源上次修改时间),常常被用于客户端下次请求时的If-Modified-Since字段中。
HTTP的缓存规则是优先考虑强制缓存,然后考虑对比缓存。
Okhttp缓存相关的类有如下:
要开启使用Okhttp的缓存其实很简单,只需要给OkHttpClient对象设置一个Cache对象即可,创建一个Cache时指定缓存保存的目录和缓存最大的大小即可。
那么下面我们来看看Okhttp缓存执行的大概流程
Okhttp的缓存流程分为读取缓存和存储缓存两个过程,我们分别分析。
读取使用缓存的流程从HttpEngine的sendRequest发送请求开始。
接下来我们分析
从Cache的get方法开始。它按以下步骤进行。
如果存在缓存的话,在指定的缓存目录中,会有两个文件“****.0”和“****.1”,分别存储某个请求缓存的响应头和响应体信息。(“****”是url的md5加密值)对应的ENTRY_METADATA响应头和ENTRY_BODY响应体。缓存的读取其实是由DiskLruCache来读取的,DiskLruCache是支持Lru(最近最少访问)规则的用于磁盘存储的类,对应LruCache内存存储。它在存储的内容超过指定值之后,就会根据最近最少访问的规则,把最近最少访问的数据移除,以达到总大小不超过限制的目的。
接下来我们分析CacheStrategy缓存策略是怎么判定的。
直接看CacheStrategy的get方法。缓存策略是由请求和缓存响应共同决定的。
接来下我们看看CacheControl类里有些什么。
可以发现,它就是用于描述响应的缓存控制信息。
然后我们再看看Okhttp存储缓存是怎么进行的。
存储缓存的流程从HttpEngine的readResponse发送请求开始的。
可以看到这里先通过maybeCache写入了响应头信息,再通过cacheWritingResponse写入了响应体信息。我们再进去看Cache的put方法实现。
我们继续看Cache的writeTo方法,可以看到是写入一些响应头信息。
到这里Okhttp缓存的读取和存储流程我们就清楚了。可以说,缓存的使用策略基本都是按照HTTP的缓存定义来实现的,所以对HTTP缓存相关字段的理解是很重要的。然后关于DiskLruCache是如何管理缓存文件的,这个其实也很好理解,首先的原则就是按照LRU这种最近最少使用删除的原则,当总的大小超过限定大小后,删除最近最少使用的缓存文件,它的LRU算法是使用LinkedHashMap进行维护的,这样来保证,保留的缓存文件都是更常使用的。具体实现大家可以分析DiskLruCache和LinkedHashMap的实现原理。
⑦ android okhttp 怎么使用spdy
OkHttp 是一个在开发可汗学院Android APP过程中非常重要的依赖库。它的默认的配置为我们提供了非常重要实用功能,下面一些步骤我们可以让Okhttp提供更多功能使用灵活和内省能力。 1. 启用文件系统上的响应缓存 默认情况下,Okhttp不支持响应缓存。可以看看安卓巴士的教程:http://www.apkbus.com/thread-465148-1-1.html
⑧ 在app开发中怎么实现app打开自动更新
Android开发如何实现APP自动更新
先来看看要实现的效果图:
Intentintent=newIntent(mContext,DownloadService.class);intent.putExtra("apkUrl","APK下载地址");startService(intent);
总结
这里我只是粗略演示本地自动更新APP的功能,在实际应用中,我们应该配合服务端来做,比如在用户启动APP的时候去比对版本号,如果版本号低于服务器的版本号,那么此时服务端应该给客户端一个透传推送,这里的推送内容应该为新版本APP的下载地址,此时就可以根据该地址来下载新版APP了,当遇到重大更新,不再对老版本进行兼容的时候,可以强制用户升级,这里的方案有很多,比如调用系统级对话框,让用户没办法取消等操作,这里就不做更多描述。以上就是这篇文章的全部内容,希望对有需要的人能有所帮助。
⑨ okhttp 怎么管理 cookie
OkHttp和HttpURLConnection一样, 是面向java的, 而且是做socket层的事情的, 使用时要在子线程调用, 通过handler发送结果到主线程. 而NoHttp和Volley不是做socket层的东西. 直接在主线程就可以调用, 拿到结果后直接更新UI, 不需要用handler去发送, 很简单.不过我推荐使用NoHttp. 原因是NoHttp封装了: 文件下载, 断点续传, 304缓存, 302/303传参数, 传文件, 请求头, 多文件上传, 大文件上传, Cookie自动管理等多种功能, 这些是Volley而没有, 使用Volley时这些功能要我们去写蛮多代码来再次封装. 而且Volley用的HttpClient来解析的, Android6.0删除了HttpClient后, 我们在6.0下也不能使用Volley的源码了, 所以还是用NoHttp吧, NoHttp兼容2.0-6.0以上 而使用OkHttp还需要我们自己去封装, 而且Android4.4之后NoHttp也是使用OkHttp做底层的.
⑩ android的Okhttp
最近在群里听到各种讨论okhttp的话题,可见okhttp的口碑相当好了。再加上Google貌似在6.0版本里面删除了HttpClient相关API,对于这个行为不做评价。为了更好的在应对网络访问,学习下okhttp还是蛮必要的,本篇博客首先介绍okhttp的简单使用,主要包含:
一般的get请求
一般的post请求
基于Http的文件上传
文件下载
加载图片
最后会对上述几个功能进行封装,完整的封装类的地址见:https://github.com/hongyangAndroid/okhttp-utils
使用前,对于Android Studio的用户,可以选择添加:
详细