做漫画的网站有哪些,成都快速建站模板,广告设计职业生涯规划书,怎么申请自媒体平台账号引言#xff1a;所有成功者的背后#xff0c;都有一份艰苦的历程#xff0c;不要只看到了人前的风光#xff0c;而低估了他们背后所付出的努力。 随着flow到流行度越来越高#xff0c;有开发者呼吁我使用flow#xff0c;于是我就如你们所愿#xff0c;新增了StateFlow作… 引言所有成功者的背后都有一份艰苦的历程不要只看到了人前的风光而低估了他们背后所付出的努力。 随着flow到流行度越来越高有开发者呼吁我使用flow于是我就如你们所愿新增了StateFlow作为新的数据载体。当然你仍然可以使用旧版本的LiveData代码写法略微不同罢了。如果对我的dcache框架设计不是很理解的小伙伴可以看我的专栏其他文章。
为什么推荐使用StateFlow
如果你非要问我为什么要使用StateFlow我可以告诉你因为可以装逼哈哈开个玩笑。新技术的流行必然有一部分炒作的部分但也肯定是有其改进的地方的。要讲StateFlow就不得不从flow开始说起。flow是属于kotlin语言范畴的你可以把它当成kotlin协程的一个API。没错kotlin语言的野心就是要做跨平台的语言答案就在这里LiveData是android的API而SharedFlow与StateFlow直接就是Kotlin编程语言级别的代码复用性更好。
LiveData和StateFlow使用对比
以列表数据模式的Repository为例。从2.1.5开始Repository注解拆分成了Repository注解和ListRepository所以2.1.4版本你应该使用Repository注解而如果说你使用的是2.1.5及以上版本的dcache库要使用ListRepository注解。由于StateFlow在2.2.0版本才开始支持所以自然要使用ListRepository注解。 先看StateFlow的写法。
override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)// 此处省略代码若干行lifecycleScope.launchWhenCreated {repository.getListFlowData().collect {adapter.setTemperatures(it)}}
}不要忘了使用协程作用域。 然后我们调用fetchListData()。
repository.fetchListData(listener object : OnLoadStateListener {override fun onLoad(state: Int) {Log.d(WeatherActivity, 数据是否加载成功${state0})}
}, description null)加载状态监听接口和描述信息可以传null。这个抓取数据方法一经调用collect代码块就会刷新数据。由于fetchListData()天然就返回的StateFlow所以你并不一定要分为两步观察数据。而如果你要分为两步则调用getListFlowData()或getFlowData()。 再看原来LiveData的写法这次我们不用list模式的Repository如果要使用直接配置Repository注解。
minutelyRepository.latlng 116.407526,39.90403
minutelyRepository.fetchData(按分钟统计天气).observe(this, Observer {it?.apply {tvCacheMinutely.text minutely:${toString()}\n}
})很明显fetchData()返回LiveData直接调用observe()进行数据的观察。简单总结下API的设计在调用层面具有相似性所以无论你使用的是LiveData为数据载体的Repository还是StateFlow的都是调用fetchData()或fetchListData()更新缓存数据框架内部自动帮你缓存到数据库同时常驻在内存并递送给UI层刷新界面。所以你可以专心开发你的业务逻辑这是不是很棒
package com.example.dcache.repositoryimport android.content.Context
import com.example.dcache.biz.weather.WeatherService
import com.example.dcache.model.WeatherModel
import dora.cache.data.fetcher.OnLoadStateListener
import dora.cache.repository.DoraDatabaseCacheRepository
import dora.cache.repository.Repository
import dora.http.DoraCallback
import dora.http.retrofit.RetrofitManagerRepository
class WeatherRepository(context: Context) : DoraDatabaseCacheRepositoryWeatherModel(context) {var latlng: String override fun onLoadFromNetwork(callback: DoraCallbackWeatherModel,listener: OnLoadStateListener?) {RetrofitManager.getService(WeatherService::class.java).getWeather(latlng).enqueue(callback)}
}最后简单复习一下Repository的写法。详细Demo代码https://github.com/dora4/DoraCacheSample 。
框架设计的变化
这是StateFlow的。
/*** 用于网络数据抓取。*/
interface IFlowDataFetcherM {/*** 清空flow data的数据。*/fun clearData()/*** 抓取数据的回调。*/fun callback(): DoraCallbackM/*** 开始抓取数据。*/fun fetchData(description: String?, listener: OnLoadStateListener? OnLoadStateListenerImpl()): StateFlowM?/*** 获取flow data。*/fun getFlowData(): StateFlowM?
}这是LiveData的。
package dora.cache.data.fetcherimport androidx.lifecycle.LiveData
import dora.http.DoraCallback/*** 用于网络数据抓取。*/
interface IDataFetcherM {/*** 清空livedata的数据。*/fun clearData()/*** 抓取数据的回调。*/fun callback(): DoraCallbackM/*** 开始抓取数据。*/fun fetchData(description: String?, listener: OnLoadStateListener? OnLoadStateListenerImpl()): LiveDataM?/*** 获取livedata。*/fun getLiveData(): LiveDataM?
}是不是没啥变化对的这就是架构设计的魅力所在。前期架构设计比较到位所以只需要遵循开闭原则。对扩展开放对修改关闭。 原先继承BaseRepository的现在继承BaseFlowRepository的。名字有带Flow单词的就是StateFlow的。
开源框架支持
笔者写框架和文档不容易希望你的支持。你的支持是我改进优化最大的动力 数据缓存dcache框架 https://github.com/dora4/dcache-android dora框架的开发插件 https://github.com/dora4/dora-studio-plugin dora框架 https://github.com/dora4/dora