Kotlin + 协程 + Retrofit ,携程 Android 面试题
}
override fun onResponse(call: retrofit2.Call<DataBean>, response: Response<DataBean>) {
TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
}
})
这只是描述了一个 retrofit 的简单请求方式,实际项目中基本上都会封装之后再使用,也为了提高代码的可读性,降低各部分的耦合性,
通俗点来说,只有各司其职才能把工作干好嘛,接下来咱们就围绕着各司其职来一个一个实现
协程实现
接下来把上面的请求换成协程的方式来实现
1.创建 RetrofitClient
object 为了使 RetrofitClient 只能有一个实例
object RetrofitClient {
val BASE_URL = "https://wanandroid.com/"
val reqApi by lazy {
val retrofit = Retrofit.Builder()
.baseUrl(BASE_URL)
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(CoroutineCallAdapterFactory())
.build()
return@lazy retrofit.create(RequestService::class.java)
}
}
2.创建 service 接口类
interface RequestService {
@GET("wxarticle/chapter
s/json")
fun getDatas() : Deferred<DataBean>
}
因为我们后续会使用到协程,所以这儿将 Call 换成了 Deferred
3.发起请求
GlobalScope.launch(Dispatchers.Main) {
withContext(Dispatchers.IO){
val dataBean = RetrofitClient.reqApi.getDatas().await()
}
//更新 ui
}
上面用到了协程,这儿只讲述他的应用了,具体的移步官方文档进一步了解。
网络请求在协程中,并且在 IO 调度单元,所以不用担会阻塞主线程
分享我的一个 Android 的学习交流群:腾讯@Android高级架构:818520403
协程 + ViewModel + LiveData 实现
上面也只是简单的实现,只不过是换成了协程,在项目中,还可以进一步封装,方便使用前面也提到了 MVVM,所以还用到了 Android 新引入的组件架构之 ViewModel 和 LiveData,先看 ViewModel 的实现
class ScrollingViewModel : ViewModel() {
private val TAG = ScrollingViewModel::class.java.simpleName
private val datas: MutableLiveData<DataBean> by lazy { MutableLiveData<DataBean>().also { loadDatas() } }
private val repository = ArticleRepository()
fun getActicle(): LiveData<DataBean> {
return datas
}
private fun loadDatas() {
GlobalScope.launch(Dispatchers.Main) {
getData()
}
// Do an asynchronous operation to fetch users.
}
private suspend fun getData() {
val result = withContext(Dispatchers.IO){
// delay(10000)
repository.getDatas()
}
datas.value = result
}
}
ViewModel 将作为 View 与数据的中间人,Repository 专职数据获取,下面看一下 Repository 的代码,用来发起网络请求获取数据
class ArticleRepository {
suspend fun getDatas(): DataBean {
评论