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}")
                }
            }
        })
    }
}
相关推荐
电子云与长程纠缠2 小时前
Godot学习05 - 播放与分离FBX动画
学习·游戏引擎·godot
蒸蒸yyyyzwd2 小时前
day3学习笔记
笔记·学习
冬奇Lab3 小时前
AudioRecord音频录制流程深度解析
android·音视频开发·源码阅读
red_redemption3 小时前
自由学习记录(143)
学习
楼田莉子4 小时前
MySQL数据库:MySQL的数据类型
数据库·学习·mysql
小陈phd4 小时前
系统架构师学习笔记(三)——计算机体系结构之存储系统
笔记·学习·系统架构
Rsun045515 小时前
AI智能体学习路线
人工智能·学习
alexhilton5 小时前
Jetpack Compose中的富文本输入
android·kotlin·android jetpack
charlie1145141915 小时前
通用GUI编程技术——Win32 原生编程实战(十六)——Visual Studio 资源编辑器使用指南
开发语言·c++·ide·学习·gui·visual studio·win32
知识分享小能手5 小时前
MongoDB入门学习教程,从入门到精通,MongoDB查询(4)
数据库·学习·mongodb