[译]Android架构组件 - 查看Lifecycles - 第三部分

原文链接:https://riggaroo.co.za/android-architecture-components-looking-lifecycles-part-3/

在这篇博文中,我们将介绍处理生命周期变化的新类。

问题

让我们想象一下,在应用程序中有一个视频播放器的情况。在同一个activity中,我们也可能会有其他操作,例如收集使用数据和外部事件的监听器(例如 - 网络更改)。通常情况下,最终可能会出现如下所示的代码:

public class VideoActivity extends Activity {
    @Override
    protected void onStart(){
        videoPlayer.start();
        analytics.start();
        //..
    }
    @Override
    protected void onStop(){
        videoPlayer.stop();
        analytics.stop();
        //..
    }
}

现在看起来可能不是一个问题,但是如果正在处理一个非常复杂的activityfragment,那么通过在不同的生命周期方法中管理组件,activity可能会变得相当凌乱。

最终将花费大量时间来确保在正确的生命周期事件中调用正确的方法。这也意味着不同组件的设计开发人员需要在activity生命周期的不同阶段暴露需要调用的相关生命周期方法。他们还需要确保文档正确地涵盖了该代码应放在何处以及为什么存在。

任何视频播放器开发人员都了解许多复杂的知识,并且可能会困惑哪里应该调用哪些方法。

可能还需要检查某些方法是否在activity处于某种状态时才被调用。例如,如果有一个监听器必须在onStart方法中注册,但是首先需要执行一些异步操作,则可能该任务在activity已暂停或停止后才完成。已知的典型解决方案包括保留一些变量来跟踪activity状态,然后检查该变量或使用RxJava订阅,并在相关的生命周期方法中取消订阅。

解决方法 —— 使用LifecycleObserver

使用新的Android Architecture组件库,现在可以使用更简单的方法来处理生命周期!不需要在每个生命周期方法中单独调用暴露的方法,现在在组件中对自定义方法注解指定的生命周期事件,收到事件后就会触发函数了。

新的Lifecycle类公开了两个枚举,EventState。Event在每个生命周期变化时发出,而State可以在任何时间点访问Lifecycle对象得到。从官方Android文档解释了这些枚举:

实现LifecycleObserver时,可以在自定义观察者中注解你的方法。这些方法在生命周期状态变化时执行。一个好的LifecycleObserver例子是LiveData类。让我们看看如何实现LifecycleObserver接口。

使用LifecycleObserver接口创建Lifecycle感知组件

首先在工程级的build.gradle中添加Google Maven仓库。

allprojects {
    repositories {
        jcenter()
        google()
    }
}

接着确保在app的build.gradle文件中引入了生命周期库:

compile "android.arch.lifecycle:runtime:1.0.0-alpha4"
compile "android.arch.lifecycle:extensions:1.0.0-alpha4"
annotationProcessor "android.arch.lifecycle:compiler:1.0.0-alpha4"

现在可以创建一个实现了Life吃一次LeO不server接口的ViewPlayerComponent类。接着给每个方法添加相应@OnLifecycleEvent注解。

public class VideoPlayerComponent implements LifecycleObserver {

    @OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
    void onCreate() {
        //..
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_START)
    void onStart() {
        if (Util.SDK_INT > 23) {
            initializePlayer();
        }
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_STOP)
    void onStop() {
        if (Util.SDK_INT > 23) {
            releasePlayer();
        }
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
    void onPause() {
        if (Util.SDK_INT <= 23) {
            releasePlayer();
        }
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
    void onResume() {
        if ((Util.SDK_INT <= 23)) {
            initializePlayer();
        }
    }
    //..
}

现在在activity中,需要做的就是添加这个自定义LifecycleObserver来观察当前生命周期。然后,VideoPlayerComponent将独立运行,而无需在onStartonStop等手动调用不同的方法。

public class VideoPlayerActivity extends LifecycleActivity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //..
        getLifecycle().addObserver(new VideoPlayerComponent(//..));

    }
}

组件需要了解activity或fragment的生命周期,而这是一个更好的构建组件的解决方案。

(注意:当架构组件不在处于alpha阶段后,LifecycleActivityLifecycleFragment类将被废弃。将来AppCompatActivity和支持的Fragment会实现LifecycleOwner接口。)

完整示例代码在这里

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值