【译文|源码】安卓架构组件ViewModel+Lifecycle+LiveData

By admin in 天文台 on 2018年10月2日

初稿(需是上网):Android lifecycle-aware components
codelab

介绍

组件
搭组件是同等组Android库,可辅助你为健康,可测试和而保障的法构建应用程序。

这个codelab向您介绍了构建Android应用程序的以下生命周期感知架构组件:

ViewModel提供了扳平种植方法来创造和寻找绑定到一定生命周期的目标。A
ViewModel通常存储视图数据的状态,并跟另零件(如数据存储库或者拍卖工作逻辑的域层)进行通信。要读书本主题的入门指南,请参考ViewModel。
LifecycleOwner /
LifecycleRegistryOwner无论是LifecycleOwner和LifecycleRegistryOwner是当落实的接口AppCompatActivity和Support
Fragment类。您可将其它零件订阅到实现这些接口的主人对象,以观测对主人生命周期的改。要读书有关此主题的入门指南,请参考处理生命周期。
LiveData允许你当应用程序的多单零件中观测对数据的变动,而无需于其中间创造明确的,严格的倚重路径。LiveData尊重你的应用程序组件的繁杂生命周期,包括活动,片段,服务要LifecycleOwner您的应用程序中定义的旁内容。LiveData通过暂停针对都告一段落LifecycleOwner对象的订阅来保管观察者订阅,并销LifecycleOwner已就目标的订阅。要看本主题的入门指南,请参阅LiveData。
汝晤面起什么
于这代码中,你兑现了地方描述的每个组件的事例。您从一个演示应用程序开始,通过同样密密麻麻步骤添加代码,随着您的进步整合各种系统结构组件。

汝用什么
Android Studio 2.3要么还强版本。
熟悉Android 活动生命周期。

第1步 – 设置您的环境

当即时同步着,您下充斥通codelab的代码,然后运行一个简短的言传身教应用程序。

点击下面的按钮来下充斥之codelab的装有代码:

下载源码

1、解压缩代码,然后打开项目Android Studio版本2.3或者重复胜版本。
2、在配备或者模拟器上运行Step 1运作配置。
拖欠应用程序运行并出示类似于以下屏幕截图的屏幕:

3、旋转屏幕并留意定时器重置!
卿现在要更新应用程序以超屏幕旋转保持状态。您可以动用一个,ViewModel因为是看似的实例存在配置更改,如屏幕旋转。

第2步 – 添加一个ViewModel

在这个手续中,你采取一个ViewModel持久的状态跨屏幕旋转,并缓解您以面前的步骤中观察到之一言一行。在事先的步子中,您运行了一个展示计时器的动。当配置更改(如屏幕旋转)破坏活动时,此计时器将重置。

乃可行使a
ViewModel在倒还是局部的全部生命周期中保存数据。正使前方的手续所示,一个动是管理应用程序数据的坏选择。活动暨一部分是不久的目标,在用户以及应用程序交互时常常创建及销毁。A
ViewModel也更符合为管理暨网络通信相关的任务,以及数据操作及持久性。

采用ViewModel保持天文钟的状态
开拓ChronoActivity2并检查该类如何寻找并下a ViewModel:

ChronometerViewModel chronometerViewModel
        = ViewModelProviders.of(this).get(ChronometerViewModel.class);

this指的是一个实例LifecycleOwner。ViewModel只要活跃的克,框架就会见维持LifecycleOwner活力。ViewModel如果那主人因安排更改(如屏幕旋转)而深受销毁,则A
不见面被灭绝。所有者的新实例更连接至现有的ViewModel,如下图所示:

警戒:活动或有的限制由创立及得(或停),您不得混淆和坏。请牢记,当设备为转时,活动让弄坏,但ViewModel与那关联的其余实例都无让毁坏。

试试看
运行应用程序(在“运行配置”下拉菜单中摘“ 步骤2
”),并认可在履以下无一操作时计时器不会见重置:

盘屏幕。
导航及任何一个应用程序,然后回来。

可是,如果您要体系退出应用程序,则定时器将重置。

提个醒:系统ViewModel在生命周期所有者的尽生命周期中(例如有或走)持续在内存中的实例。系统非会见用实例ViewModel存储到永积存着。

第3步 – 使用LiveData封装数据

于此手续中,您将下前步骤中采用的天文台替换为从定义天文台Timer,并且每秒更新一糟UI。A
Timer是java.util您可为此来更计划未来任务之类似。您将之逻辑添加到LiveDataTimerViewModel该类,并将拖欠走留在管制用户和UI之间的互。

当定时器通知她时,活动更新UI。为了帮忙避免内存泄漏,ViewModel不包针对移动的援。例如,配置更改(如屏幕旋转)可能会见促成ViewModel应该给垃圾收集之移位之援。系统保留实例,ViewModel直到相应的移动或者生命周期所有者不再在。

顾:存储到一个参考上下文或视图中ViewModel可能会见导致内存泄漏。避免引用Context或View类的实例的字段。所述onCleared()方法是用以破除引用有因此退订或明显的援和丰富周期其它的目的,但不Context或View对象。

免是一直打视图中改视图ViewModel,而是安排移动还是局部来考察数据源,并以数来变更时接收数据。这种布局让称为观察者模式。

留神:要拿数据作为observable公开,请将拖欠型包装至LiveData类吃。

若果你已采取了数额绑定库或者RxJava等另外反应性库,则可能熟悉观察者模式。LiveData是一个新鲜之万丈察类,它是生命周期感知的,只能通知活跃的观察者。

LifecycleOwner

ChronoActivity3是一个LifecycleActivity可以提供生命周期状态的实例。这是接近声明:

public class LifecycleActivity extends FragmentActivity implements LifecycleRegistryOwner {...}

将LifecycleRegistryOwner用于的实例的生命周期结合ViewModel并LiveData与移动或有。片段的等价类是LifecycleFragment。

更新ChronoActivity

1.将下的代码添加到方法被的ChronoActivity3类中subscribe(),以创办订阅:

mLiveDataTimerViewModel.getElapsedTime().observe(this, elapsedTimeObserver);

2.以LiveDataTimerViewModel类中设置新的经过岁月价值。找到以下评论:

//TODO set the new value

故此底的言语替换注释:

mElapsedTime.setValue(newValue);

3.周转应用程序并在Android
Studio中开辟Android监视器。注意日志每秒更新,除非您导航及其它一个应用程序。如果你的配备支撑多窗口模式,您得品尝使用它。旋转屏幕不会见潜移默化应用程序的作为。

在意:LiveData对象只是在活动时发送更新,或者处于LifecycleOwner活动状态。如果你导航及不同的应用程序,则日志消息会暂停,直到你回去。LiveData对象就考虑订阅作为活性时她各自的生命周期所有者是无一STARTED要么RESUMED。

第4步 – 订阅生命周期事件
多Android组件和仓库要求您:

  1. 订阅或初始化组件或库。
  2. 撤订阅,或已组件或库。

不能做到上述手续可能引致内存泄漏和神秘的谬误。
生命周期所有者对象好传递让生命周期感知组件的新实例,以管教他们知晓生命周期的当前状态。
汝可以采用以下语句询问生命周期的脚下状态:

lifecycleOwner.getLifecycle().getCurrentState()

面的言语返回一个状态,比如Lifecycle.State.RESUMED,或者Lifecycle.State.DESTROYED。

实现之生命周期感知对象LifecycleObserver还足以洞察生命周期所有者状态的生成:

lifecycleOwner.getLifecycle().addObserver(this);

您得注释该目标为指示它以急需常调用适当的方法:

@OnLifecycleEvent(Lifecycle.EVENT.ON_RESUME)
void addLocationListener() { ... }

开创一个生命周期感知组件
以斯步骤中,您将开创一个针对走生命周期所有者作出反应的零件。使用一些作为生命周期所有者时,应用类的原则及步子。

而可以Android框架LocationManager获取当前的经纬度并以其形为用户。此添加允许而:

  • 订阅更改并采用自动更新UI LiveData。
  • LocationManager基于对活动状态的改动,创建该注册及收回注册的卷入。

您便会订阅一个移动或措施的LocationManager更改,并去或艺术吃的侦听器:

onStart()onResume()onStop()onPause()
// Typical use, within an activity.

@Override
protected void onResume() {
    mLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, mListener);
}

@Override
protected void onPause() {
    mLocationManager.removeUpdates(mListener);
}

在这个手续中,你以一个LifecycleOwner叫做LifecycleRegistryOwner的类似的兑现BoundLocationManager。BoundLocationManager类的名是指类的实例绑定到倒之生命周期的实。

以为课堂观察移动的生命周期,您得将该作观察者添加。为了达到这BoundLocationManager目的,通过以下面的代码添加到那构造函数中来指示对象观察生命周期:

lifecycleOwner.getLifecycle().addObserver(this);

若是在生命周期更改发生时调用方法,可以使@OnLifecycleEvent注释。使用类吃的以下注释更新addLocationListener()和removeLocationListener()方法BoundLocationListener:

@OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
void addLocationListener() {
    ...
}
@OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
void removeLocationListener() {
    ...
}

留神:观察者被带及提供者的即状态,所以未欲addLocationListener()从构造函数调用。当观察者被补加到生命周期所有者时,它会叫调用。

运转应用程序天文台并认可日志监视器在您旋转设备时展示以下操作:

D / BoundLocationMgr:添加了监听器
D / BoundLocationMgr:删除了监听器
D / BoundLocationMgr:添加了监听器
D / BoundLocationMgr:删除了监听器

运Android模拟器模拟更改设备的位置(单击三个点坐展示扩展控件)。在TextView当它改变时被更新:

第5步 – 在有些中共享ViewModel
使用a完成以下附加步骤ViewModel以启用片段中的通信并实行以下操作:

  • 一个纯的倒。
  • 一个组成部分的有限个实例,每个都有一个SeekBar。
  • 一个纯净ViewModel的LiveData领域。

运行此手续,注意少个实例是SeekBar相互独立的:

总是碎片,ViewModel以便SeekBar更改一个时不时,另一个SeekBar更新:

a6c30f446ff0869a.png

小心:您应该使用该活动作为生命周期所有者,因为每个片的生命周期是独自的。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图
Copyright @ 2010-2018 亚洲必赢手机官网 版权所有