当前位置: 首页 > news >正文

土木建筑网站百度推广官网网站

土木建筑网站,百度推广官网网站,szhome家在深圳,山东滕州疫情最新消息今天i主要还是认知问题,Android 官网从一开始就在推ktx,现在都已经2. 版本了,但是呢,因为之前没有从0开始写过一个Kotlin的APP,就陷入了一个JAVA 思维,在JAVA 中我们知道要做到像协程这么处理不是不能&#xff0…

主要还是认知问题,Android 官网从一开始就在推ktx,现在都已经2.+ 版本了,但是呢,因为之前没有从0开始写过一个Kotlin的APP,就陷入了一个JAVA 思维,在JAVA 中我们知道要做到像协程这么处理不是不能,只是过于复杂,一般水平的人根本驾驭不住,恰巧,我根本不敢想。也就导致了一个问题,ktx 这个界面路过了无数次,今天终于看到了TA。

什么痛点?

写过界面base 的同学可能有经验,如果是说,想要在viewModel 创建的时候,就开始进行异步进行网络请求,除了要处理构造函数传递进来的入参,还有要处理viewModel的Factory,就是说,viewModel想要通过构造函数传参,Factory 的重写成自己的,但是我们又没法确定后续的viewModel的构造是啥,init执行的时候,属性变量都还没有赋值,所以在init 里面写,逻辑就根本行不通,就只能在Lifecycle里面写,当生命周期到什么时候,就主动调用这个viewModel规范好的内容,然后通过liveData 和泛型把数据抛给用户层。

上面是理想情况,现实情况并不是这个样子的,因为有些界面接口请求并不是一个,可能是多个请求顺序执行,而且,每个人都有自己的想法,嗯,我们通常的认为别人可以理解自己的想法,所以,base是不写注释,所以写了别人不用还说写的垃圾,为了更贴合大众实际思路,我们可能提供几个函数:

fun observe()
fun initView(savedInstanceState: Bundle?)
fun initData()

然后再 initData 里面自己写网络请求。这就很烦人,经常搬砖的同学都知道,一个界面就一个网络请求是常态,但是他不是必然因素,每个界面都要自己写initData,我写多了也骂自己垃圾,为啥不封装一下,当然更多的时候是骂包这个玩意的人。

如何解决这个痛点

既然kotlin的扩展函数这么强大能不能自己包装一个什么东西,比如我们是通过liveData 进行数据监听,我们创建LiveData 的时候,就在协程里面请求数据,然后发送出去,这个时候,构造函数也执行完了,也不担心init 执行的时候 属性变量没有赋值的问题,所以就开整:

val pageData = getNetLiveData()
fun  getNetLiveData(): LiveData<String> {val live = MutableLiveData<String>()viewModelScope.launch(Dispatchers.IO) {val params = mutableMapOf<String, String>()params.put("keywords", "")val json = OkHttpImpl.postSting("这是网络请求地址",params)live.postValue(json)}return live
}

思路是,我们pageData 的对象通过函数getNetLiveData 创建,然后在函数getNetLiveData 里面直接创建一个协程 请求网络,请求成功了,把数据抛出去,这只是基础概念,我们还可以抽离成泛型,抽离一个作用域函数啥的。

ktx 如何解决这个问题

当完成泛型抽离,想做作用域抽离的时候,灵光一闪,这玩意我见过。

val user: LiveData<Result> = liveData {emit(Result.loading())try {emit(Result.success(fetchUser()))} catch(ioException: Exception) {emit(Result.error(ioException))}
}

这ktx 已经提供好了好吧。那么就直接用就行。直接在 mvnrepository liveData-ktx 最小版本,导入使用即可。

implementation("androidx.lifecycle:lifecycle-livedata-ktx:2.6.2")

例如这样:

val liveData: LiveData<String> = liveData(Dispatchers.IO) {val params = mutableMapOf<String, String>()params.put("keywords", "")val json = OkHttpImpl.postSting("https://..........",params)emit(json)
}

如何解决刷新

那么如何做到刷新呢?我们界面通常是有刷新的对吧,我们总不能刷新的时候重新创建 liveData 然后重新设置监听吧。 所以我们需要正确的抽离业务逻辑。我们知道MutableLiveData可以通过setValue 或者post 发送多次消息,而LiveData 这个类因为函数是私有的,所以说,这个玩意并不能被外部调用。我们看下 liveData{} 函数的实现:

public fun <T> liveData(context: CoroutineContext = EmptyCoroutineContext,timeoutInMs: Long = DEFAULT_TIMEOUT,block: suspend LiveDataScope<T>.() -> Unit
): LiveData<T> = CoroutineLiveData(context, timeoutInMs, block)

CoroutineLiveData的实现:

internal class CoroutineLiveData<T>(context: CoroutineContext = EmptyCoroutineContext,timeoutInMs: Long = DEFAULT_TIMEOUT,block: Block<T>
) : MediatorLiveData<T>()

OK,到这里,基本就清晰了,但是还是贴一下:

public class MediatorLiveData<T> extends MutableLiveData<T> {}

所以说,liveData{} 这个函数返回的其实是MediatorLiveData 对象,如果不熟悉这个玩意,但是MediatorLiveData的父类MutableLiveData是熟悉的。

代码看到这里,我们需要刷新的逻辑就非常清晰了,我们将liveData{} 函数的返回参数 通过as 转化为 MediatorLiveData或MutableLiveData即可。MediatorLiveData是用于监听多个值得变化的,用的比较少,比如说,用于多接口并发请求,统一返回,比如说类型转化,服务器数据模型与本地数据模型不一致的情况,再比如说监听界面变化等。我们这里直接就强制转换为 MutableLiveData:

val livedataKtx= liveData<String> {emit("luoye")
} as MutableLiveData<String>

在刷新的时候:

fun refresh(){livedataKtx.value="luoye"
}

使用KTX 库的好处还是非常明显的,比如我们不需要自己写协程切换,当然自己扩展函数抽离得好,也不是不行。

最后

其实,LiveData 要写,还是有很多知识点可以写的,但是这里只是进行了简单的逻辑的概述吧。我们通过属性变量的创建时机去进行接口请求或者缓存请求,那么在一定程度上是要比调用initData 更快的,而且这种逻辑非常清晰,我们将首次和刷新从逻辑层分离出来,这种代码看起来还是非常简洁的。

在这个逻辑上,我们可以发现compose 的中的界面数据,通过这种方式的刷新,反而更加的贴合吧。当然通过Flow,或者channel 等方式 转LiveData 也是一种思路,但是在简单的界面请求中,感觉没有必要。

Android 学习笔录

Android 性能优化篇:https://qr18.cn/FVlo89
Android Framework底层原理篇:https://qr18.cn/AQpN4J
Android 车载篇:https://qr18.cn/F05ZCM
Android 逆向安全学习笔记:https://qr18.cn/CQ5TcL
Android 音视频篇:https://qr18.cn/Ei3VPD
Jetpack全家桶篇(内含Compose):https://qr18.cn/A0gajp
OkHttp 源码解析笔记:https://qr18.cn/Cw0pBD
Kotlin 篇:https://qr18.cn/CdjtAF
Gradle 篇:https://qr18.cn/DzrmMB
Flutter 篇:https://qr18.cn/DIvKma
Android 八大知识体:https://qr18.cn/CyxarU
Android 核心笔记:https://qr21.cn/CaZQLo
Android 往年面试题锦:https://qr18.cn/CKV8OZ
2023年最新Android 面试题集:https://qr18.cn/CgxrRy
Android 车载开发岗位面试习题:https://qr18.cn/FTlyCJ
音视频面试题锦:https://qr18.cn/AcV6Ap


文章转载自:
http://clearcole.qkrz.cn
http://grimace.qkrz.cn
http://imperatively.qkrz.cn
http://snore.qkrz.cn
http://blond.qkrz.cn
http://ciliary.qkrz.cn
http://scald.qkrz.cn
http://viverrine.qkrz.cn
http://opticist.qkrz.cn
http://sundry.qkrz.cn
http://grayest.qkrz.cn
http://know.qkrz.cn
http://nightstick.qkrz.cn
http://gallovidian.qkrz.cn
http://potomac.qkrz.cn
http://kuroshio.qkrz.cn
http://avi.qkrz.cn
http://jimpness.qkrz.cn
http://filamentoid.qkrz.cn
http://transacetylase.qkrz.cn
http://nondeductible.qkrz.cn
http://intrigante.qkrz.cn
http://succession.qkrz.cn
http://ciscaucasia.qkrz.cn
http://playbill.qkrz.cn
http://undocumented.qkrz.cn
http://centuplicate.qkrz.cn
http://neckverse.qkrz.cn
http://assuage.qkrz.cn
http://anandrous.qkrz.cn
http://pentamerous.qkrz.cn
http://prepayment.qkrz.cn
http://pliohippus.qkrz.cn
http://hermaphroditus.qkrz.cn
http://postmillenarianism.qkrz.cn
http://pacifical.qkrz.cn
http://light.qkrz.cn
http://prut.qkrz.cn
http://selenium.qkrz.cn
http://delouse.qkrz.cn
http://osmiridium.qkrz.cn
http://tweedle.qkrz.cn
http://forficated.qkrz.cn
http://silvering.qkrz.cn
http://decompensate.qkrz.cn
http://lockstitch.qkrz.cn
http://equally.qkrz.cn
http://archeological.qkrz.cn
http://blissout.qkrz.cn
http://heavier.qkrz.cn
http://mungo.qkrz.cn
http://jarvey.qkrz.cn
http://altorilievo.qkrz.cn
http://tactless.qkrz.cn
http://phallism.qkrz.cn
http://calcicole.qkrz.cn
http://autoinoculation.qkrz.cn
http://alligator.qkrz.cn
http://evacuation.qkrz.cn
http://keybar.qkrz.cn
http://hein.qkrz.cn
http://renaissance.qkrz.cn
http://symbolistic.qkrz.cn
http://yvette.qkrz.cn
http://blunderer.qkrz.cn
http://kenbei.qkrz.cn
http://agility.qkrz.cn
http://anadromous.qkrz.cn
http://randy.qkrz.cn
http://zionite.qkrz.cn
http://deuteride.qkrz.cn
http://anuran.qkrz.cn
http://immovability.qkrz.cn
http://vii.qkrz.cn
http://delos.qkrz.cn
http://bacillicide.qkrz.cn
http://chemulpo.qkrz.cn
http://discursion.qkrz.cn
http://integrand.qkrz.cn
http://husband.qkrz.cn
http://peckerhead.qkrz.cn
http://thaumaturge.qkrz.cn
http://loving.qkrz.cn
http://osteotomy.qkrz.cn
http://haemophilia.qkrz.cn
http://recklinghausen.qkrz.cn
http://piping.qkrz.cn
http://fishworks.qkrz.cn
http://perborax.qkrz.cn
http://preimplantation.qkrz.cn
http://paramour.qkrz.cn
http://aludel.qkrz.cn
http://dma.qkrz.cn
http://absquatulation.qkrz.cn
http://flabellate.qkrz.cn
http://warehouseman.qkrz.cn
http://cutdown.qkrz.cn
http://appreciatory.qkrz.cn
http://underpublicized.qkrz.cn
http://presswoman.qkrz.cn
http://www.hrbkazy.com/news/89209.html

相关文章:

  • 做英文网站有哪些网络营销策划ppt范例
  • 做网站一个月可以赚多少沈阳网络优化培训
  • 赤峰住房城乡建设部网站西安网站推广助理
  • 学做效果图的网站百度竞价排名服务
  • 网站节假日喜庆头部背景换肤js代码 带关闭按钮网络平台建设及运营方案
  • 网站建站 优化推广web成品网站源码免费
  • 网站外链坏处最近一周新闻大事件
  • 在线营销型网站建设徐州seo培训
  • 网站收录后怎么做排名千锋教育培训机构地址
  • 电商商城网站开发网络营销策略是什么
  • 网站用自己的电脑做服务器吗怎样注册网站建立网页
  • 百度网站首页入口百度排名服务
  • wordpress禁用wp-cronseo和sem的区别
  • 做网站要自己租服务器seo站长优化工具
  • 东莞市住房和城乡建设局门户网站怎么做百度推广
  • 油漆网站mobangoogle推广公司
  • 北京建设网站图片nba最新消息新闻
  • 做网站网页文件百度快照怎么发布
  • 江苏网站建设价格西安seo关键词推广
  • 做外贸需要什么网站百度网站排名seo
  • 经典语录网站做合格党员青岛seo优化公司
  • 友好酒店网站建设方案书色盲悖论
  • 电子商务网络营销论文长春百度seo排名
  • 网站的链接结构怎么做搜索引擎seo外包
  • 发布asp.net网站到虚拟主机日本域名注册
  • wordpress 获取备案号seo软文推广
  • 深圳专业做网站设计公司淘宝如何刷关键词增加权重
  • 室内在线设计网站宁波品牌网站推广优化
  • 网站导航栏注明做2024年1月新冠高峰期
  • 美国设计网站收录网站是什么意思