当前位置:   article > 正文

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

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

简介

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

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

简单使用

1. 在 APP 目录下的 build.gradle 里添加依赖

  1. // retrofit
  2. // https://github.com/square/retrofit
  3. implementation 'com.squareup.retrofit2:retrofit:2.9.0'
  4. // 使用 gson 解析 json
  5. // https://github.com/google/gson
  6. implementation 'com.google.code.gson:gson:2.9.0'
  7. // 适配 retrofit 使用 gson 解析
  8. // 版本要和 retrofit 一样
  9. implementation 'com.squareup.retrofit2:converter-gson:2.9.0'

2. 在 AndroidManifest.xml 里添加网络权限

<uses-permission android:name="android.permission.INTERNET"/>

3. NetworkModule.kt 创建 Retrofit 实例

  1. object NetworkModule {
  2. /**
  3. * TODO 创建 Retrofit 实例
  4. */
  5. fun createRetrofit(okHttpClient: OkHttpClient) : Retrofit{
  6. // 返回一个 retrofit 实例
  7. return Retrofit.Builder()
  8. .client(okHttpClient) // 让 retrofit 使用 okhttp
  9. .baseUrl("http://v.juhe.cn/") // api 地址
  10. .addConverterFactory(GsonConverterFactory.create(GsonBuilder().create()))// 使用 gson 解析 json
  11. .build()
  12. }
  13. /**
  14. * TODO 创建 OkHttpClient 实例
  15. */
  16. fun createOkHttpClient() : OkHttpClient{
  17. // 返回一个 OkHttpClient 实例
  18. return OkHttpClient.Builder()
  19. .connectTimeout(30, TimeUnit.SECONDS)// 设置连接超时时间
  20. .writeTimeout(10, TimeUnit.SECONDS)
  21. .readTimeout(10, TimeUnit.SECONDS)
  22. .build()
  23. }
  24. }

4. NetworkService.kt 创建网络请求的 Service。是一个接口类

  1. interface NetworkService {
  2. @GET("toutiao/index")
  3. suspend fun getNewsService(
  4. @Query(value = "key") key : String
  5. ) : NewsEntity
  6. /**
  7. * TODO 通过 Retrofit 创建一个 NetworkService 实例
  8. */
  9. companion object{
  10. fun createService() : NetworkService {
  11. return NetworkModule.createRetrofit(NetworkModule.createOkHttpClient())
  12. .create(NetworkService::class.java) // TODO 返回一个 NetworkService 的实例
  13. }
  14. }
  15. }

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

  1. class NewsEntity {
  2. var reason : String? = null //返回说明
  3. //var result : Result? = null // 返回结果
  4. var error_code : Int = 0 // 返回码
  5. }

5. MainActivity.kt 进行网络请求

  1. class MainActivity : AppCompatActivity() {
  2. private lateinit var networkRequest : TextView
  3. override fun onCreate(savedInstanceState: Bundle?) {
  4. super.onCreate(savedInstanceState)
  5. setContentView(R.layout.activity_main)
  6. networkRequest = findViewById(R.id.network_request)
  7. // TODO 点击发送网络请求
  8. networkRequest.setOnClickListener{
  9. // TODO 网络请求为耗时操作,放到协程作用域里进行
  10. lifecycleScope.launch {
  11. val networkService = NetworkService.createService()
  12. val newsEntity = networkService.getNewsService("40279bee66d427555ce361fe49387a8e")
  13. Log.d("HL", newsEntity.reason.toString())
  14. }
  15. }
  16. }
  17. }

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

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 的方式,查看请求是否成功。

Log.d("HL", newsEntity.reason.toString())

 

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

本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号