网络 - OkHttp

一、概念

二、基本使用

2.1 get请求

fun getCall() {
    //创建客户端
    val client = OkHttpClient.Builder()
        .connectTimeout(5000, TimeUnit.MILLISECONDS)
        .build()
    //创建请求
    val request = Request.Builder()
        .get()
        .url("https://www.baidu.com")
        .build()
    //创建任务
    val call = client.newCall(request)
    //执行任务
    call.enqueue(object : Callback {
        override fun onFailure(call: Call, e: IOException) {
            Log.d("ErrorMsg", e.toString())
        }
        override fun onResponse(call: Call, response: Response) {
            //结果码==200
            if (response.code == HttpURLConnection.HTTP_OK) {
                response.body
                //(反序列化,json转bean)
                val dataBean = Gson().fromJson(response.body.toString(), DataBean::class.java)
            }
        }
    })
}

2.2 post请求

fun postCall() {
    //创建客户端
    val client = OkHttpClient.Builder()
        .connectTimeout(5000, TimeUnit.MILLISECONDS)
        .build()
    //创建要提交的内容(序列化,内容转bean再转json)
    val dataBean = DataBean("张三")
    val jsonStr = Gson().toJson(dataBean)
    val mediaType = "application/json".toMediaTypeOrNull()
    val requestBody = jsonStr.toRequestBody(mediaType)
    //创建请求
    val request = Request.Builder()
        .post(requestBody)
        .url("https://www.baidu.com")
        .build()
    //创建任务
    val call = client.newCall(request)
    //执行任务
    call.enqueue(object : Callback {
        override fun onFailure(call: Call, e: IOException) {
            Log.d("ErrorMsg", e.toString())
        }
        override fun onResponse(call: Call, response: Response) {
            Log.d("Result", response.body.toString())
        }
    })
}

三、使用缓存

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

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

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

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

private val cache by lazy {
    //缓存存放路径
    val cacheFile = File(APP.context.externalCacheDir, "retrofitCache")
    //缓存大小100M
    val cacheSize = (1024 * 1024 * 100).toLong()
    //创建缓存对象
    Cache(cacheFile, cacheSize)
}

private val okHttpClient by lazy {
    OkHttpClient.Builder()
        .cache(cache)    //设置缓存
        .build()
}

3.2 使用 Interceptor(自行配置Response)

private val intercept = object : Interceptor{
    override fun intercept(chain: Interceptor.Chain): Response {
        val request = chain.request()
        val response = chain.proceed(request).apply {
            newBuilder()
                .removeHeader("pragma")
                .header("Cache-Control","max-age=60")
                .build()
        }
        return response
    }
}

private val okHttpClient by lazy {
    OkHttpClient.Builder()
        .chache(cache)
        .addNetworkInterceptor(intercept)   //添加网络拦截器
        .build()
}

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秒钟。
private val intercept = object : Interceptor{
    override fun intercept(chain: Interceptor.Chain): Response {
        val request = chain.request().apply {
            val cacheControl = CacheControl.Builder()
                .maxAge(60,TimeUnit.SECONDS)    //缓存缓存有效期60秒
                .build()
            newBuilder()
//              .cacheControl(CacheControl.FORCE_CACHE)    //使用定义好的
                .cacheControl(cacheControl)    //使用自定义的
                .build()
        }
        val response = chain.proceed(request)
        return response
    }
}

private val okHttpClient by lazy {
    OkHttpClient.Builder()
        .chache(cache)
        .addNetworkInterceptor(intercept)   //添加网络拦截器
}
  • 12
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值