您的位置 首页 > 数码极客

okhttp如何设置缓存

前言

今天在这里要讲的是一个网络库,okHttp相对于其它网络库有很多不同,使用、效率、拦截器都有很多不同,当然也有坏处,比如callback回来

是在线程里面, 不能刷新UI,访问请求跟apache有很多不同,这点注意,还有访问请求的时候,Get和Post有不同就是看一个地方,如果是用其它

网络库,一定会迷惑到底那个才是Get\POST,文章中会细细解答,本文会以介绍、使用、优缺点来三大块阐述。

一、介绍

OKHttp是一款高效的HTTP客户端,支持连接同一地址的链接共享同一个socket,通过连接池来减小响应延迟,

还有透明的GZIP压缩,请求缓存等优势,其核心主要有路由、连接协议、拦截器、代理、安全性认证、连接池以

及网络适配,拦截器主要是指添加,移除或者转换请求或者回应的头部信息,总流程图如下:

当然要详细了解核心解刨内核东西网址如:

等。

二、使用

1.okhttp初始化

Interceptor REWRITE_CACHE_CONTROL_INTERCEPTOR = new Interceptor() {

@Override public Response intercept(Chain chain) throws IOException {

Response originalResponse = c());

return originalRe()

.removeHeader("Pragma")

.header("Cache-Control", S("max-age=%d", 60))

.build();

}

};

mOkH(15000, TimeUnit.SECONDS);

mOkH(15000, TimeUnit.SECONDS);

mOkH(15000, TimeUnit.SECONDS);

mOkH(true);

//-------------------------------设置http缓存,提升用户体验-----------------------------------

Cache cache;

File httpCacheDirectory = S(context,HTTP_CACHE_FILENAME);

cache = new Cache(httpCacheDirectory, 10 * 1024);

mOkH(cache);

mOkH().add(REWRITE_CACHE_CONTROL_INTERCEPTOR);

//-------------------------------设置http缓存,提升用户体验-----------------------------------

// Handler mDelivery = new Handler());

if (false) {

mOkH(new HostnameVerifier() {

@Override

public boolean verify(String hostname, SSLSession session) {

return true;

}

});

}

2.Get申请数据


  1. Request request = new Reque()
  2. .url("网络地址这里面设置一个传参数如何办")
  3. .addHeader("Accept", "application/json; q=0.5").build();

上面代码看到url缺么有带post,这就是get,我当时看到这个半天还在想这就是Get,至少带get的字样,缺么有,这就是Get,然后这

里面涉及的一个参数如何传。会有两个问题参数如何传、如果是apache的,如何转到okhttps,后面都会在我的github会封装一个库。


  1. <span style="white-space:pre"> </span>FormEncodingBuilder body = new FormEncodingBuilder();
  2. for ;String, String> entry : ()) {
  3. body.addEncoded(), en());
  4. }
  5. Request request = new Reque()
  6. .url(getUrlWithQueryString(true, , params))
  7. .build();
  8. try {
  9. BaseOkHandler handler = new BaseOkHandler(callback, params);
  10. client.newCall(request).enqueue(handler);
  11. } catch (Exception e) {
  12. e.printStackTrace();
  13. }

上面看到的params就相当于apache中的RequestParams类,里面传入参数就可以,借鉴的并做修改后得到。


  1. getUrlWithQueryString(boolean shouldEncodeUrl, String url, BaseParams params) {
  2. if (url == null)
  3. return null;
  4. if (shouldEncodeUrl) {
  5. try {
  6. String decodedURL = URLDecoder.decode(url, "UTF-8");
  7. URL _url = new URL(decodedURL);
  8. URI _uri = new URI(), _url.getUserInfo(), _url.getHost(), _url.getPort(), _url.getPath(),
  9. _url.getQuery(), _url.getRef());
  10. url = _uri.toASCIIString();
  11. } catch (Exception ex) {
  12. // Should not really happen, added just for sake of validity
  13. }
  14. }
  15. if (params != null) {
  16. // Construct the query string and trim it, in case it
  17. // includes any excessive white spaces.
  18. String paramString = ().trim();
  19. // Only add the query string if it isn't empty and it
  20. // isn't equal to '?'.
  21. if (!("") && !("?")) {
  22. url += url.contains("?") ? "&" : "?";
  23. url += paramString;
  24. }
  25. }
  26. return url;
  27. }

而这个函数就是把所有参数格式化拼接成一个字符串。

3.Post申请数据


  1. Request request = new Reque()
  2. .url(url)
  3. .post(body)//post是关键,提交表单数据、这里面有封装好多库。
  4. .build();
  5. Response response = client.newCall(request).execute();

4.Post提交文件


  1. MultipartBuilder builder = new MultipartBuilder().type);
  2. if () > 0) {
  3. RequestBody fileBody = null;
  4. for ;String, Ba; entry1 : ()) {
  5. {
  6. File file = en().file;
  7. String fileName = ();
  8. fileBody = Reque(guessMimeType(fileName)), file);
  9. //TODO 根据文件名设置contentType
  10. builder.addPar("Content-Disposition",
  11. "form-data; name=\"" + en() + "\"; filename=\"" + fileName + "\""),
  12. fileBody);
  13. }
  14. }
  15. }
  16. Request request = new Reque()
  17. .url()
  18. .po())
  19. .build();

大家看到上传文件只要使用MultipartBuilder类表单传入就可以。

5.消息回来处理


  1. public class BaseOkHandler implements Callback {
  2. private HttpCallback callBack;
  3. BaseParams param;
  4. public BaseOkHandler(HttpCallback response, BaseParams cacheParams) {
  5. = response;
  6. param = cacheParams;
  7. }
  8. @Override
  9. public void onFailure(Request request, IOException e) {
  10. }
  11. @Override
  12. public void onResponse(Response response) throws IOException {
  13. try {
  14. if ()) {
  15. //成功得到文本信息
  16. String content = re().string();
  17. //通过Handler来传给UI线程。
  18. Message msg =new Message();
  19. m = content;
  20. m;
  21. mHandler.sendMessage(msg);
  22. }
  23. } catch (Exception e) {
  24. // TODO Auto-generated catch block
  25. e.printStackTrace();
  26. }
  27. }
  28. Handler mHandler = new Handler() {
  29. @Override
  30. public void handleMessage(Message msg) {
  31. (msg);
  32. switch ) {
  33. case 0:
  34. //得到数据并去做解析类。
  35. BaseEntity entity = J(m.toString(), );
  36. //通知UI界面
  37. callBack.onSuccess(m.toString(), entity, );
  38. break;
  39. default:
  40. break;
  41. }
  42. }
  43. };
  44. }

三、优缺点

1、优点

支持SPDY, 可以合并多个到同一个主机的请,使用连接池技术减少请求的延迟(如果SPDY是可用的话) ,

使用GZIP压缩减少传输的数据量,缓存响应避免重复的网络请求、拦截器等等。

2、缺点

第一缺点是消息回来需要切到主线程,主线程要自己去写,第二传入调用比较复杂。

责任编辑: 鲁达

1.内容基于多重复合算法人工智能语言模型创作,旨在以深度学习研究为目的传播信息知识,内容观点与本网站无关,反馈举报请
2.仅供读者参考,本网站未对该内容进行证实,对其原创性、真实性、完整性、及时性不作任何保证;
3.本站属于非营利性站点无毒无广告,请读者放心使用!

“okhttp如何设置缓存”边界阅读