• 网络 - OkHttp


    一、概念

    二、基本使用

    2.1 get请求

    1. fun getCall() {
    2. //创建客户端
    3. val client = OkHttpClient.Builder()
    4. .connectTimeout(5000, TimeUnit.MILLISECONDS)
    5. .build()
    6. //创建请求
    7. val request = Request.Builder()
    8. .get()
    9. .url("https://www.baidu.com")
    10. .build()
    11. //创建任务
    12. val call = client.newCall(request)
    13. //执行任务
    14. call.enqueue(object : Callback {
    15. override fun onFailure(call: Call, e: IOException) {
    16. Log.d("ErrorMsg", e.toString())
    17. }
    18. override fun onResponse(call: Call, response: Response) {
    19. //结果码==200
    20. if (response.code == HttpURLConnection.HTTP_OK) {
    21. response.body
    22. //(反序列化,json转bean)
    23. val dataBean = Gson().fromJson(response.body.toString(), DataBean::class.java)
    24. }
    25. }
    26. })
    27. }

    2.2 post请求

    1. fun postCall() {
    2. //创建客户端
    3. val client = OkHttpClient.Builder()
    4. .connectTimeout(5000, TimeUnit.MILLISECONDS)
    5. .build()
    6. //创建要提交的内容(序列化,内容转bean再转json)
    7. val dataBean = DataBean("张三")
    8. val jsonStr = Gson().toJson(dataBean)
    9. val mediaType = "application/json".toMediaTypeOrNull()
    10. val requestBody = jsonStr.toRequestBody(mediaType)
    11. //创建请求
    12. val request = Request.Builder()
    13. .post(requestBody)
    14. .url("https://www.baidu.com")
    15. .build()
    16. //创建任务
    17. val call = client.newCall(request)
    18. //执行任务
    19. call.enqueue(object : Callback {
    20. override fun onFailure(call: Call, e: IOException) {
    21. Log.d("ErrorMsg", e.toString())
    22. }
    23. override fun onResponse(call: Call, response: Response) {
    24. Log.d("Result", response.body.toString())
    25. }
    26. })
    27. }

    三、使用缓存

    当某些网络访问获取的内容是短时间不变的(每月榜单)或长时间不变的(歌曲的信息),每次访问都联网获取数据的话,会重复浪费用户和公司的流量费用和带宽占用。

    服务端侧缓存当客户端重复访问一张图片地址时,服务器会判断这个请求有没有缓存,有的话就直接返回掉这个请求,而不是到达真正的服务器地址,依次减轻运算压力。
    客户端侧缓存客户端将服务器返回的数据缓存在本地,再次访问同一地址的时候,客户端会检测本地是否有缓存,如果有且未过期就直接使用缓存内容。
    使用 Cache客户端能够同服务端一起协同开发,以服务器设置的消息头缓存策略为准。
    使用 Interceptor没法协同开发,自己设置 Cache-Control 来控制缓存策略,Interceptor 可以拿到 Request 和 Response。属于一刀切,经常更新和很久更新的数据无法细分处理。
    使用 CacheControl每个 Request 有它自己的缓存时间。

    3.1 使用 Cache(自适应服务器配置)

    设置好Cache后,同一个地址访问两次打印Log:第一次访问的response.networkResponse( )有内容(来自网络)而response.cacheResponse( ) = null;第二次访问相反,response.cacheResponse( )有内容(来自缓存)而response.networkResponse( ) = null。

    1. private val cache by lazy {
    2. //缓存存放路径
    3. val cacheFile = File(APP.context.externalCacheDir, "retrofitCache")
    4. //缓存大小100M
    5. val cacheSize = (1024 * 1024 * 100).toLong()
    6. //创建缓存对象
    7. Cache(cacheFile, cacheSize)
    8. }
    9. private val okHttpClient by lazy {
    10. OkHttpClient.Builder()
    11. .cache(cache) //设置缓存
    12. .build()
    13. }

    3.2 使用 Interceptor(自行配置Response)

    1. private val intercept = object : Interceptor{
    2. override fun intercept(chain: Interceptor.Chain): Response {
    3. val request = chain.request()
    4. val response = chain.proceed(request).apply {
    5. newBuilder()
    6. .removeHeader("pragma")
    7. .header("Cache-Control","max-age=60")
    8. .build()
    9. }
    10. return response
    11. }
    12. }
    13. private val okHttpClient by lazy {
    14. OkHttpClient.Builder()
    15. .chache(cache)
    16. .addNetworkInterceptor(intercept) //添加网络拦截器
    17. .build()
    18. }

    3.3 使用 CacheControl(自行配置Request)

    类中提供了两个已经定义好的,通过伴生对象调用,一般根据有无网络访问来返回不同的对象。也可以根据需求通过 CacheControl.Builder() 自定义。

    CacheControl.FORCE_NETWORK只获取网络数据。
    CacheControl.FORCE_CACHE只读取本地缓存。
    noStore()不使用缓存,也不存储缓存。
    onlyIfCached()只使用缓存。
    noTransform()禁止转码。
    maxAge(10, TimeUnit.MILLISECONDS)超时时间为10ms。
    maxStale(10, TimeUnit.SECONDS)超时之外的超时时间为10s。
    minFresh(10, TimeUnit.SECONDS)超时时间为当前时间加上10秒钟。
    1. private val intercept = object : Interceptor{
    2. override fun intercept(chain: Interceptor.Chain): Response {
    3. val request = chain.request().apply {
    4. val cacheControl = CacheControl.Builder()
    5. .maxAge(60,TimeUnit.SECONDS) //缓存缓存有效期60秒
    6. .build()
    7. newBuilder()
    8. // .cacheControl(CacheControl.FORCE_CACHE) //使用定义好的
    9. .cacheControl(cacheControl) //使用自定义的
    10. .build()
    11. }
    12. val response = chain.proceed(request)
    13. return response
    14. }
    15. }
    16. private val okHttpClient by lazy {
    17. OkHttpClient.Builder()
    18. .chache(cache)
    19. .addNetworkInterceptor(intercept) //添加网络拦截器
    20. }
  • 相关阅读:
    高性能计算环境下的深度学习异构集群建设与优化实践
    英语语法学习
    【Java实现图书管理系统】
    做设计迷茫时怎么办 优漫动游
    什么是SQL注入(SQL Injection)?如何预防它
    口袋参谋:如何提升宝贝流量?这三种方法超实用!
    快速了解GPT-4o和GPT-4区别
    【Aseprite】2D像素山脉背景的制作
    【Shell编程】| if 判断
    【STL源码剖析】STL六大组件功能与运用(目录)
  • 原文地址:https://blog.csdn.net/HugMua/article/details/136272608