物联网基础入门实战可落地的 AIoT 项目

121 阅读3分钟

download:物联网基础入门实战可落地的 AIoT 项目

四个子列表需求四个接口来获取,组装好后来刷新最后的列表

其中每个列表都有可能是空,是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 {

// planner

val plannerDefer = async { Request.getPlannlist() }

// favourite

val 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中渲染

viewModel.dataList.observe(viewLifecycleOwner) {

mAdapter.submitList(it)

}

复制代码

此种方式简单,并且有效处置了按次第排列四个列表的需求,缺陷是体验差,假定有一个接口极慢,其他几个就会等候它,用户看着loading不时发呆么。

方案二:接口间不再互相等候,哪个接口先回来就渲染哪个,问题就是如何保证次第?

有的同窗会有方案:先定制一个空数据list

val list = listOf(

Container("planner", emptylist()),

Container("favourite", emptylist()),

...

)

复制代码

然后先用adapter去渲染list,哪个接口回来就去之前的列表查找交流,然后adapter刷新对应的数据,当然可以,不过会产生一部分逻辑胶水代码,查找遍历的操作。

此时我们可以借助flow来完成了

1 构造一个planner数据流

val plannerFlow = flow {

val plannList = Request.getPlanlist()

emit(ContainerData("Planner", plannList))

}.onStart {

emit(ContainerData("", emptylist()))

}

复制代码

留意是个val 变量, 不要写成 fun plannerFlow() 方法,不然每次调用开辟新栈的时分新建个flow,并且会不时保管在内存中,直到协程取消

其中onStart 会在发送正式数据之前发送,作为预加载。

然后我们就可以构造正式央求了

viewModelScope.launch {

combine(plannerFlow , favouriteFlow , xxxFlow ,xxxFlow) { planner , favourites , xxx , xxx ->

mutableListOf(planner , favourites , xxx,xxx)

}.collect {

datalist.postValue(it)

}

}

复制代码

combine 的官方注释为

Returns a Flow whose values are generated with transform function by combining the most recently emitted values by each flow.

复制代码

combine操作符可以衔接两个不同的Flow , 一旦产生数据就会触发组合后的flow的活动,同时它是有序的。