非 Jectpack 架构项目使用协程(Coroutine)
**未经授权,不得转载**
项目没有重构为 Jectpack 架构,也没有使用 ViewMode,但鉴于协程的优秀,希望提前使用。
普通方法启动协程有 `runBlocking`、`GlobalScope.launch/async`、`MainScope().launch/async`。在实际项目中,前两个 Google 不建议使用,而推荐自定义的协程作用域,第三个是 Kotlin 提供的,符合要求。
1. 添加依赖
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:latest'
2. Activity 或 Fragment 实现 CoroutineScope
class SampleFragment : Fragment(), CoroutineScope by MainScope() {
...
}
3. 请求接口,添加 suspend 关键字,注意返回值
interface ApiService {
companion object {
const val BASE_URL = "https://www.xx.com/"
}
/**文章列表*/
@GET("article/list/{page}/json")
suspend fun reqArticleList(@Path("page") page: Int): ApiResponse<ArticleList<Article>>
}
data class ApiResponse<T>(
val `data`: T?,
val errorCode: Int,
val errorMsg: String
) {
fun isSuccess() = errorCode == 0
}
4. 发送请求
private fun requestData(page: Int) {
launch {
val response = RetrofitCreator.apiService.reqArticleList(page) // Retrofit,请求数据
// 解析响应
if (response.isSuccess()) {
...
} else {
...
}
}
}
5. 取消协程
// fragment
override fun onDestroyView() {
super.onDestroyView()
cancel()
}
代码示例:传送门
**未经授权,不得转载**