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}")
                }
            }
        })
    }
}
相关推荐
fanchenxinok1 小时前
学习笔记:LabVIEW调用DLL解析S19文件教程
笔记·学习·labview·dll解析
hunterandroid1 小时前
WorkManager 可靠性实战:唯一任务、重试与幂等设计
android·前端
程序员老刘1 小时前
Android 17的10个AI功能,国内用户真正能用的有几个?
android·flutter·ai编程
芷栀夏2 小时前
Java教育平台实战复盘:课程、考试与学习行为分析系统设计
java·开发语言·学习
从零开始的代码生活_2 小时前
C++ 多态详解:虚函数、动态绑定、抽象类与虚表原理
开发语言·c++·后端·学习·算法
花开彼岸天~2 小时前
鸿蒙应用开发实战【94】— 实战多卡号场景管理最佳实践
android·华为·harmonyos·鸿蒙系统
用户41659673693552 小时前
视频源文件音频轨异常分析记录
android
执笔论英雄4 小时前
【大模型推理 】 vllm kvconnet 学习
学习·vllm
·醉挽清风·5 小时前
学习笔记—算法—算法题
笔记·学习·算法
a1117765 小时前
机器人导航入门指南(从 0 到 1)
笔记·学习·slam