写点什么

Kotlin + 协程 + Retrofit ,携程 Android 面试题

用户头像
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


《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》
浏览器打开:qq.cn.hn/FTe 免费领取
复制代码


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 {

用户头像

Android架构

关注

还未添加个人签名 2021.10.31 加入

还未添加个人简介

评论

发布
暂无评论
Kotlin + 协程 + Retrofit ,携程Android面试题