Android---Retrofit实现网络请求:Kotlin版

简介

在 Android 开发中,网络请求是一个极为关键的部分。Retrofit 作为一个强大的网络请求库,能够简化开发流程,提供高效的网络请求能力。

Retrofit 是一个建立在 OkHttp 基础之上的网络请求库,能够将我们定义的 Java 接口转化为相应的 HTTP请求,Retrofit 是适用于 Android 和 Java 的类型安全 HTTP 客户端。通过Retrofit,我们可以轻松发起网络请求,还能将服务器返回的数据转换为所需的格式,如 JSON。

简单使用

  1. 在 APP 目录下的 build.gradle 里添加依赖
Groovy 复制代码
    // retrofit
    // https://github.com/square/retrofit
    implementation 'com.squareup.retrofit2:retrofit:2.9.0'
    // 使用 gson 解析 json
    // https://github.com/google/gson
    implementation 'com.google.code.gson:gson:2.9.0'
    // 适配 retrofit 使用 gson 解析
    // 版本要和 retrofit 一样
    implementation 'com.squareup.retrofit2:converter-gson:2.9.0'
  1. 在 AndroidManifest.xml 里添加网络权限
Groovy 复制代码
<uses-permission android:name="android.permission.INTERNET"/>
  1. NetworkModule.kt 创建 Retrofit 实例
Kotlin 复制代码
object NetworkModule {

    /**
     * TODO 创建 Retrofit 实例
     */
    fun createRetrofit(okHttpClient: OkHttpClient) : Retrofit{
        // 返回一个 retrofit 实例
        return Retrofit.Builder()
            .client(okHttpClient) // 让 retrofit 使用 okhttp
            .baseUrl("http://v.juhe.cn/") // api 地址
            .addConverterFactory(GsonConverterFactory.create(GsonBuilder().create()))// 使用 gson 解析 json
            .build()
    }

    /**
     * TODO 创建 OkHttpClient 实例
     */
    fun createOkHttpClient() : OkHttpClient{
        // 返回一个 OkHttpClient 实例
        return OkHttpClient.Builder()
            .connectTimeout(30, TimeUnit.SECONDS)// 设置连接超时时间
            .writeTimeout(10, TimeUnit.SECONDS)
            .readTimeout(10, TimeUnit.SECONDS)
            .build()
    }
}
  1. NetworkService.kt 创建网络请求的 Service。是一个接口类
Kotlin 复制代码
interface NetworkService {

    @GET("toutiao/index")
    suspend fun getNewsService(
        @Query(value = "key") key : String
    ) : NewsEntity

    /**
     * TODO 通过 Retrofit 创建一个 NetworkService 实例
     */
    companion object{
        fun createService() : NetworkService {
            return NetworkModule.createRetrofit(NetworkModule.createOkHttpClient())
                .create(NetworkService::class.java) // TODO 返回一个 NetworkService 的实例
        }
    }
}

NewsEntity 是一个实体类,解析返回的数据。Result.kt 是一个具体的数据类,可根据返回的数据进行细化。

Kotlin 复制代码
class NewsEntity {

    var reason : String? = null //返回说明
    //var result : Result? = null // 返回结果

    var error_code : Int = 0 // 返回码
}
  1. MainActivity.kt 进行网络请求
Kotlin 复制代码
class MainActivity : AppCompatActivity() {
    private lateinit var networkRequest : TextView

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        networkRequest = findViewById(R.id.network_request)
        // TODO 点击发送网络请求
        networkRequest.setOnClickListener{

            // TODO 网络请求为耗时操作,放到协程作用域里进行
            lifecycleScope.launch {
                val networkService = NetworkService.createService()
                val newsEntity = networkService.getNewsService("40279bee66d427555ce361fe49387a8e")
                Log.d("HL", newsEntity.reason.toString())
            }
        }
    }
}

网络请求是异步操作,需要在协程里进行。这里使用 lifecycleScope.launch{ ...} 进行。使用 Lifecycle 添加如下依赖。

Groovy 复制代码
implementation ("androidx.lifecycle:lifecycle-livedata-ktx:2.6.1")

请求的数据是聚合数据上的新闻头条API接口,请求地址为: "http://v.juhe.cn/toutiao/index?key=40279bee66d427555ce361fe49387a8e"。由于是使用的 http 请求头,所以需要在 AndroidManifest.xml 里添加 android:usesCleartextTraffic="true",更改网络安全配置。

最后,通过打印 Log 的方式,查看请求是否成功。

Kotlin 复制代码
Log.d("HL", newsEntity.reason.toString())

对应的 Java 版本实现:Android---Retrofit实现网络请求:Java 版

相关推荐
檀越剑指大厂2 小时前
容器化 Android 开发效率:cpolar 内网穿透服务优化远程协作流程
android
MiyamuraMiyako3 小时前
从 0 到发布:Gradle 插件双平台(MavenCentral + Plugin Portal)发布记录与避坑
android
NRatel4 小时前
Unity 游戏提升 Android TargetVersion 相关记录
android·游戏·unity·提升版本
叽哥6 小时前
Kotlin学习第 1 课:Kotlin 入门准备:搭建学习环境与认知基础
android·java·kotlin
风往哪边走6 小时前
创建自定义语音录制View
android·前端
用户2018792831676 小时前
事件分发之“官僚主义”?或“绕圈”的艺术
android
用户2018792831676 小时前
Android事件分发为何喜欢“兜圈子”?不做个“敞亮人”!
android
Kapaseker8 小时前
你一定会喜欢的 Compose 形变动画
android
QuZhengRong9 小时前
【数据库】Navicat 导入 Excel 数据乱码问题的解决方法
android·数据库·excel
zhangphil10 小时前
Android Coil3视频封面抽取封面帧存Disk缓存,Kotlin(2)
android·kotlin