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 版

相关推荐
千里马学框架1 天前
一起学 Android 14:ShellTransition 屏幕旋转过程深度剖析
android·智能手机·性能优化·framework·性能·屏幕旋转·rotation
美狐美颜SDK开放平台1 天前
开发直播APP时如何接入视频美颜SDK?开发流程与注意事项
android·人工智能·计算机视觉·音视频·直播美颜sdk
AFinalStone1 天前
Android7 SystemUI源码解析(七)Keyguard锁屏模块深度解析
android·systemui
致远ccc1 天前
Google Play 上架前如何测试 App?多国家 Android 环境测试
android·app测试·googleplay·多国家应用测试
ttyyttemo1 天前
Kotlin 协程中的 Job 结构化并发与取消
android
sun0077001 天前
tbox 4g/5g切换,导致wan ip 改变,导致车机旧网络不可用。需要重启车机才行
android
ai2work1 天前
ch23 综合复刻:从零做一个最小可用版本(capstone)
kotlin
其实防守也摸鱼2 天前
内网穿透与反向代理:原理、工具与实战指南
android·大数据·运维·安全·网络安全·自动化·渗透
ai2work2 天前
ch21 签名、校验与发版
kotlin
AFinalStone2 天前
Android7 SystemUI 源码解析(四)NavigationBar 导航栏与 SystemBars
android·systemui