天文台安卓架构组件ViewModel

By admin in 天文台 on 2019年1月16日

原稿(需科学上网):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封装数据

在这一个手续中,您将使用前边步骤中拔取的天文台替换为自定义天文台提姆(Tim)er,并且每秒更新五回UI。A
提姆er是java.util您可以用来再度计划将来任务的类。您将此逻辑添加到LiveData提姆erViewModel该类,并将该运动留在管理用户和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.在LiveData提姆(Tim)erViewModel类中装置新的通过时间值。找到以下评论:

//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);

要在生命周期更改爆发时调用方法,可以动用@OnLifecycle伊夫nt注释。使用类中的以下注释更新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-2019 亚洲必赢手机官网 版权所有