Jetpack实现安卓中数据共享的方式

语言: CN / TW / HK

highlight: a11y-dark theme: channing-cyan


持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第7天,点击查看活动详情

实际开发中我们总是会碰到这种需求。就是需要将数据在同一个acitivtiy中的AFramgent和BFragment之间传递。比如:AFragment中有某个产品选中了,当切换到BFragment时这种产品需要作出样式上的改变。这时候安卓的做法一般有两种: - 当AFragment某个产品被选中后把该产品唯一标识记录下来,当切换到B时,取出标识然后进行相应逻辑处理。取标识可以通过公共的acitivity也可以通过EventBus等数据传递方式; - 通过宿主acitivity增加回调接口的方式传递。

jetpack可以利用ViewModel实现这种效果,接下里就介绍ViewModel实现这种数据传递的方式。

ViewModel是什么?

ViewModel类是根据生命周期的方式存储和管理界面相关的数据。ViewModel类可在发生屏幕旋转的时候让数据继续保存而后恢复。

# ViewModel生命周期:

image.png   如上图所示,ViewModel的生命周期远远长于activity页面的一整个生命周期。我们知道屏幕旋转的生命周期是这样的onPause-->onStop-->onSaveInstanceState-->onDestroy-->onCreate--> onStart-->onRestoreInstanceState-->onResume。因为ViewModel比activity的生命周期要长所以就可以通过把需要保存的数据在ViewModel中保存,当需要恢复的时候从中取出即可。这时候其实又有一个新的问题,因为ViewModel的生命周期比activity长如果通过activity上下文对象构建ViewModel,会导致内存泄漏。那么接下来我们聊聊ViewModel内存泄漏的事。

Viewmodel实现数据共享:

``` class ShareDataViewModel: ViewModel (){

private var currentId : String =0

fun getcurrentId (): String {(
return currentId
}

fun productChanged ( currentId : String ){
    this . currentId = currentId
}

} ```   ShareDataViewModel继承自Viewmodel。AFragment当标签变化时通过ShareDataViewModel的实例调用productChanged方法传入产品的id,当BFragment要根据id更改UI时通过ShareDataViewModel的实例调用getcurrentId方法获取到id后更新UI。

通过这样的方式,ViewModel就实现了页面间的数据共享问题。

感谢您的阅读,专注才能提高学习效率,peace!