Android --- Kotlin学习之路:Okhttp 同步异步网络请求

kotlin 复制代码
package com.example.kotlindemo

import android.util.Log
import okhttp3.Call
import okhttp3.Callback
import okhttp3.FormBody
import okhttp3.OkHttpClient
import okhttp3.Request
import okhttp3.Response
import java.io.IOException
import java.util.concurrent.TimeUnit

object OKHttp {
    private val BASE_URL = "https://jsonplaceholder.typicode.com"
    val client: OkHttpClient = OkHttpClient.Builder()
        .connectTimeout(10, TimeUnit.SECONDS)
        .readTimeout(10, TimeUnit.SECONDS)
        .writeTimeout(10, TimeUnit.SECONDS)
        .build()

    // 同步get请求,需要在子线程中执行,否则会阻塞主线程
    fun get() {
        // okhttp 网络请求
        Thread(Runnable {
            // 构建请求体
            val request: Request = Request.Builder()
                .url("$BASE_URL/posts/1")
                .build()
            // 构建请求对象
            val call: Call = client.newCall(request)
            // 发起同步请求
            val response = call.execute()
            // 获取返回值
            val body = response.body?.string()
            println(body)
        }).start()
    }

    // 异步get请求
    fun getAnsyc() {
        // 构建请求体
        val request: Request = Request.Builder()
            .url("$BASE_URL/posts/1")
            .build()
        // 构建请求对象
        val call: Call = client.newCall(request)
        // 发起同步请求
        val response = call.enqueue(object : Callback {
            override fun onFailure(call: Call, e: IOException) {
                Log.e("okhttp", "get onFailure : ${e.message}")
            }

            override fun onResponse(call: Call, response: Response) {
                if (response.isSuccessful) {
                    val body = response.body?.string()
                    Log.i("okhttp", "get success :$body")
                }
            }
        })
    }

    // post 的异步请求
    fun getPost() {
        // 构建RequestBody
        val body: FormBody = FormBody.Builder()
            .add("userId", "1")
            .add("id", "4")
            .build()
        // 构建请求体
        val request: Request = Request.Builder()
            .url("$BASE_URL/posts")
            .post(body)
            .build()
        // 构建请求对象
        val call: Call = client.newCall(request)
        // 发起同步请求
        call.enqueue(object : Callback {
            override fun onFailure(call: Call, e: IOException) {
                Log.e("okhttp", "post onFailure : ${e.message}")
            }

            override fun onResponse(call: Call, response: Response) {
                if (response.isSuccessful) {
                    val body = response.body?.string()
                    Log.i("okhttp", "post success : ${body}")
                }
            }
        })
    }
}
相关推荐
用户20187928316711 分钟前
MVP架构模式:餐厅点餐的有趣故事
android
Laplaces Demon13 分钟前
Spring 源码学习(十四)—— HandlerMethodArgumentResolver
java·开发语言·学习
用户20187928316737 分钟前
MVVM 架构模式:咖啡馆的智能点餐系统
android
用户20187928316741 分钟前
浅析Android MVC架构
android
青衫码上行44 分钟前
【从0开始学习Java | 第22篇】反射
java·开发语言·学习
hmbbcsm1 小时前
python学习之路(四)
学习
Greedy Alg1 小时前
Socket编程学习记录
网络·websocket·学习
知识分享小能手1 小时前
uni-app 入门学习教程,从入门到精通,uni-app 基础知识详解 (2)
前端·javascript·windows·学习·微信小程序·小程序·uni-app
曼城的天空是蓝色的2 小时前
在环境条件下通过学习基于不同角度的交互信息来实现行人轨迹预测
学习
阳光宅男@李光熠2 小时前
【质量管理】构建供应链韧性的第一道防线——高风险供应商的识别
笔记·学习