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}")
                }
            }
        })
    }
}
相关推荐
千码君20166 分钟前
Trae:一些关于flutter和 go前后端开发构建的分享
android·flutter·gradle·android-studio·trae·vibe code
幸福巡礼2 小时前
【LangChain 1.2 实战(一)】 概述
笔记·学习·langchain
jason.zeng@15022072 小时前
Androidr入门环境搭建
java·kotlin
知识分享小能手2 小时前
R语言入门学习教程,从入门到精通,R语言数据计算与分组统计(9)
开发语言·学习·r语言
lizhihai_993 小时前
股市学习心得—半导体12种核心材料
大数据·人工智能·学习
sakiko_3 小时前
UIKit学习笔记3-布局、滚动视图、隐藏或显示视图
前端·笔记·学习·objective-c·swift·uikit
重生之我是Java开发战士3 小时前
【MySQL】事务 & 用户与权限管理
android·数据库·mysql
嵌入式-老费4 小时前
瑞芯微soc的学习和应用(题外话之esp32开发)
学习
辰同学ovo5 小时前
从全局登录状态管理学习 Redux
前端·javascript·学习·react.js
ting94520005 小时前
告别无效学习:Scholé 如何用 AI 重构职场学习,让学习直接嵌入工作流
人工智能·学习·重构