关于jetpack:Jetpack架构演化初步运用flow附加经典案例
Jetpack架构演变:初步使用flow,附加经典案例在jetpack体系中 livedata的角色纯纯粹粹是个桥接器,DataSource中获取到数据,而后由viewmodel停止逻辑处理,最初被livedata.postValue到view层,唯一的价值是绑定了lifecycle, 只在页面活泼(start)的时候承受数据官网的一篇介绍能够参考:从 LiveData 迁徙到 Kotlin 数据流 - 掘金对于初学者来说使用lieveData的益处是足够简略和绝对平安引入flow次要因为以下几点: 具备更敌对的API,学习成本较低跟Kotlin协程、LiveData分离更严密,Flow可能转换成LiveData,在ViewModel中间接使用分离协程的作用域,当协程被勾销时,Flow也会被勾销,防止内存走漏flow库从属于kotlin, livedata属于Android, 托付Android平台的限度对于将来跨平台开展无利 【flow是个冷数据流】所谓冷流,即上游无消费行为时,上游不会产生数据,只需上游开始生产,上游才开始产生数据。而所谓热流,即无论上游是否有消费行为,上游都会本人产生数据。下边通过一个经典场景粗疏描绘下flow(单纯的flow,而stateFlow会在后续章节中解说)的使用案例:一个菜谱利用app中,我想在一个页面展现一个列表(recyclerview) ,此列表的每个item是个子列表,子列表顺次为打算菜谱列表;珍藏菜谱列表;依据食材抉择的菜谱列表;依据食材获取用户偏好的菜谱列表; 四个子列表需要四个接口来获取,组装好起初刷新最初的列表其中每个列表都有可能是空,是emptylist的话这行就不浮现了,因为四个接口数据量大小不同,所以不会同一时间返回,同时又要保障这四个子列表按请求的次序来展现。思路:设计数据结构,最外层的data: data class ContainerData(val title : String , val list: List)复制代码其中Recipe实体是每个菜谱 data class Recipe(val id: String, val name: String, val cover: String, val type: Int, val ingredients: List? = mutableListOf(), val minutes: Int, val pantryItemCount : Int )复制代码模仿四个恳求为: val plannlist = Request.getPlannlist()val favouritelist= Request.getFavouritelist()... 以此类推假如依照请求四个恳求返回秩序不同,同时请求在列表中按次序浮现,假如实现?计划一:能够等待四个恳求都返回后而后组装数据,刷新列表能够利用协程的await办法: val dataList = MutableLiveData()viewModelScope.launch {// plannerval plannerDefer = async { Request.getPlannlist() }// favouriteval favouriteDefer = async { Request.getFavouritelist() }val plannerData = plannerDefer.await()val favouriteData = favouriteDefer.await()....省略后两个接口val list = listof(Container("planner" , plannerData),Container("favourite" , favouriteData),...)dataList.postValue(list)}复制代码await() 办法是挂起协程,四个接口异步恳求(非次序),等最初一个数据恳求返回后才会执行下边的步骤而后组装数据利用liveData发送,在view中渲染 ...