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 版

相关推荐
cjzcjl5 分钟前
Android OpenGL ES 离屏幕渲染1——EGL环境的创建,以及基础概念的理解
android·创建·egl·eglcontext·eglsurface
吃饱很舒服26 分钟前
kotlin distinctBy 使用
android·java·开发语言·前端·kotlin
Lik10242 小时前
ReactNative如何实现沉浸式状态栏及渐变色Header【兼容Android和iOS】
android·react native·ios
带带老表学爬虫3 小时前
常用 Android 反编译工具apktooldex2jarenjarifyjd-guijadx
android
Geeker559 小时前
如何在忘记密码的情况下解锁Android手机?
android·网络·macos·华为·智能手机·电脑·手机
wxx215010 小时前
【android】【adb shell】写一个shell脚本,监听进程pid变化
android·adb
心死翼未伤12 小时前
【MySQL基础篇】多表查询
android·数据结构·数据库·mysql·算法
喂_balabala12 小时前
Android手机拍照或从本地相册选取图片设置头像-高版本适配
android·开发语言
_小马快跑_13 小时前
Android | StandardCharsets.UTF_8.toString() 遇到的兼容问题记录
android
wxx215014 小时前
【Android】【多屏】多屏异显异触调试技巧总结
android