在 Android 中使用 Kotlin 协程进行改造
Kotlin 团队将协程定义为“轻量级线程”。它们是实际线程可以执行的任务。协程是在 1.3 版中添加到 Kotlin 的,并且基于其他语言的既定概念。 Kotlin 协程引入了一种新的并发风格,可以在 Android 上使用以简化异步代码。在本文中,我们将学习使用 Kotlin 协程进行改造。所以我们将使用 Retrofit 来处理网络请求。 Retrofit 是一个非常流行的库,用于工作 API,也非常常用。我们将通过使用 API 制作一个简单的应用程序来学习它,以使用 Retrofit 获取一些数据。
分步实施
第 1 步:创建一个新项目
要在 Android Studio 中创建新项目,请参阅如何在 Android Studio 中创建/启动新项目。
第二步:添加依赖
导航到Gradle Scripts > build.gradle(Module:app)并在依赖项部分添加以下依赖项。
// retrofit
implementation ‘com.squareup.retrofit2:retrofit:2.9.0’
// GSON
implementation ‘com.squareup.retrofit2:converter-gson:2.9.0’
// coroutine
implementation ‘org.jetbrains.kotlinx:kotlinx-coroutines-android:1.5.2’
implementation ‘org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.2’
我们正在使用 GSON 将 JSON 转换为 kotlin(Java) 对象。我们将在项目的 build.gradle 文件中添加这些依赖项。
第 3 步:我们将使用以下 API
https://quotable.io/quotes?page=1
所以我们的 JSON 响应将如下图 01 所示。
第 4 步:然后我们将根据 JSON 响应创建数据类
在 JSON 响应中,我们有 2 个 JSON 对象,所以我们将创建 2 个数据类
- 报价单
- 结果
Kotlin
// data class QuoteList
// according to JSON response
package com.ayush.retrofitexample
data class QuoteList(
val count: Int,
val lastItemIndex: Int,
val page: Int,
val results: List,
val totalCount: Int,
val totalPages: Int
)
Kotlin
package com.ayush.retrofitexample
data class Result(
val _id: String,
val author: String,
val authorSlug: String,
val content: String,
val dateAdded: String,
val dateModified: String,
val length: Int,
val tags: List
)
Kotlin
// Retrofit interface
package com.ayush.retrofitexample
import retrofit2.Response
import retrofit2.http.GET
import retrofit2.http.Query
interface QuotesApi {
@GET("/quotes")
suspend fun getQuotes() : Response
}
Kotlin
package com.ayush.retrofitexample
import retrofit2.Retrofit
import retrofit2.converter.gson.GsonConverterFactory
object RetrofitHelper {
val baseUrl = "https://quotable.io/"
fun getInstance(): Retrofit {
return Retrofit.Builder().baseUrl(baseUrl)
.addConverterFactory(GsonConverterFactory.create())
// we need to add converter factory to
// convert JSON object to Java object
.build()
}
}
Kotlin
package com.ayush.retrofitexample
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.launch
import retrofit2.create
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val quotesApi = RetrofitHelper.getInstance().create(QuotesApi::class.java)
// launching a new coroutine
GlobalScope.launch {
val result = quotesApi.getQuotes()
if (result != null)
// Checking the results
Log.d("ayush: ", result.body().toString())
}
}
}
第二类数据
科特林
package com.ayush.retrofitexample
data class Result(
val _id: String,
val author: String,
val authorSlug: String,
val content: String,
val dateAdded: String,
val dateModified: String,
val length: Int,
val tags: List
)
第 5 步:我们将创建一个 Retrofit 接口来添加 URL 的端点(在我们的例子中,引号是端点)
科特林
// Retrofit interface
package com.ayush.retrofitexample
import retrofit2.Response
import retrofit2.http.GET
import retrofit2.http.Query
interface QuotesApi {
@GET("/quotes")
suspend fun getQuotes() : Response
}
第 6 步:我们将创建一个新文件来获取 Retrofit 对象
在这个文件中,我们将有一个返回 Retrofit 对象的函数。
科特林
package com.ayush.retrofitexample
import retrofit2.Retrofit
import retrofit2.converter.gson.GsonConverterFactory
object RetrofitHelper {
val baseUrl = "https://quotable.io/"
fun getInstance(): Retrofit {
return Retrofit.Builder().baseUrl(baseUrl)
.addConverterFactory(GsonConverterFactory.create())
// we need to add converter factory to
// convert JSON object to Java object
.build()
}
}
第 7 步:现在我们将在 MainActivity 中链接 Retrofit 对象和 Retrofit 接口文件
科特林
package com.ayush.retrofitexample
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.launch
import retrofit2.create
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val quotesApi = RetrofitHelper.getInstance().create(QuotesApi::class.java)
// launching a new coroutine
GlobalScope.launch {
val result = quotesApi.getQuotes()
if (result != null)
// Checking the results
Log.d("ayush: ", result.body().toString())
}
}
}
第 8 步:在清单文件中添加 Internet 权限
结果:我们可以查看logcat窗口。我们可以在绿色框中看到结果。
输出: