Android Development Platform Libraries 之 Lifecycles(一)

一、概述

最近简单看了下google推出的框架Jetpack,感觉此框架的内容可以对平时的开发有很大的帮助,也可以解决很多开发中的问题,对代码的数据逻辑和UI界面深层解耦,实现数据驱动型的ui,本片文章简单介绍其中一个组建Lifecycles,只是一个入门使用,后面会陆续介绍每个组建的使用,希望对没接触的同学优点帮助,共同学习新的东西。

二、Lifecycles的作用

  • lifecycles简介:

生命周期是一个持有组件生命周期状态(如活动或片段)的信息的类,并允许其他对象观察此状态。生命周期使用两个主要枚举来跟踪其关联组件的生命周期状态:

  1. Event:从框架和Lifecycle类派发的生命周期事件。 这些事件映射到活动和片段中的回调事件。
  2. State:由Lifecycle对象跟踪的组件的当前状态。

  • lifecycles使用场景

Lifecycles:生命周期感知组件处理生命周期,从名字中就可以知道,这个方法是处理生命周期的相关的操作。在平时的开发过程中,我们难免有些逻辑的执行适合UI的生命周期相结合的,需要在特定的生命周期中执行相应的方法,我们平时做的可能就是在View中的每个周期调用Present中获取数据的方法,然后在调用View的回掉接口更新获取数据后的UI,但现在使用Lifecycles可以使用注解和观察的模式自动调用Observe中定义好的方法。

我们看个简单的例子,我们需要在每个周期输出周期的名字,那我们就要在每个周期方法中调用:

override fun onResume() {
     super.onResume()
     toast("onResume")
    }

override fun onPause() {
     super.onPause()
     toast("onPause")
    }

override fun onDestroy() {
     super.onDestroy()
     toast("onDestroy")
    }

上述情况属于直接调用方法的基本使用,当需要调用其他类中的方法并且需要回掉是即可使用接口可回掉处理,在想用的生命周期中调用方法,在处理完数据后使用接口回掉数据:

  1. 生命数据处理的类MyLocationListener
class MyLocationListener {
    public MyLocationListener(Context context, Callback callback) {
        // ...
    }

    void start() {
        // connect to system location service
    }

    void stop() {
        // disconnect from system location service
    }
}

   2、调用类中的方法并设置回掉

class MyActivity : AppCompatActivity {
    var myLocationListener :MyLocationListener

    override fun onCreate(...) {
        myLocationListener = new MyLocationListener(this, location -> {
        });
    }

    @Override
    override fun  onStart() {
        super.onStart();
        Util.checkUserStatus(result -> {
            if (result) {
                myLocationListener.start();
            }
        });
    }

    @Override
    override fun  onStop() {
        super.onStop();
        myLocationListener.stop();
    }
}

上述是我们平时开发最常用的接口方法,这样左虽然也很方便但这种模式导致代码的组织不良以及错误泛滥,使用支持生命周期的组件执行操作以响应另一个组件(例如活动和片段)的生命周期状态更改。这些组件可帮助您生成组织性更好,并且通常重量更轻的代码,这些代码更易于维护,下面我们来看看LifeCycles的使用。

三、Lifecycles的使用

  • gradle的引入(此处已Kotlin语言为例)
// ViewModel and LiveData
    implementation "android.arch.lifecycle:extensions:$lifecycle_version"
    // alternatively - just ViewModel
    implementation "android.arch.lifecycle:viewmodel:$lifecycle_version" // use -ktx for Kotlin
    // alternatively - just LiveData
    implementation "android.arch.lifecycle:livedata:$lifecycle_version"
    // alternatively - Lifecycles only (no ViewModel or LiveData).
    //     Support library depends on this lightweight import
    implementation "android.arch.lifecycle:runtime:$lifecycle_version"
    annotationProcessor "android.arch.lifecycle:compiler:$lifecycle_version"
    // alternately - if using Java8, use the following instead of compiler
    implementation "android.arch.lifecycle:common-java8:$lifecycle_version"
    // optional - ReactiveStreams support for LiveData
    implementation "android.arch.lifecycle:reactivestreams:$lifecycle_version"
  • 创建MyObserve 
class MyObserver(var lifecycle: Lifecycle, var callback: CallBack) : LifecycleObserver {

    @OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
    public fun connectOnCreate() {
        p("connectOnCreate")
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
    public fun connectOnResume() {
            p("connectOnResume")
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
    public fun disConnectOnDestroy() {
        p("disConnectOnDestroy")
    }

    fun p(string: String) {
        callback.update(string)
    }
}
  1. 创建MyObserver 继承 LifecycleObserver
  2. 传入Lifecycles和Callback,Lifecycles为绑定Activity的生命周期,CallBack用于处理数据后的回调
  3. 使用注解在每个方法上标记相应的生命周期

  • Implementing a custom LifecycleOwner

      创建Activity并实现LifecyclesOwner,重写方法:

class LifeCyclerActivity : AppCompatActivity(), LifecycleOwner {
}
  • 创建LifecycleRegistry,并返回lifecycleRegistry
lateinit var lifecycleRegistry: LifecycleRegistry
    lifecycleRegistry = LifecycleRegistry(this)
    override fun getLifecycle(): Lifecycle {
        return lifecycleRegistry
    }
  • 实例化创建MyObserver,绑定Lifecycles
var myObserver = MyObserver(lifecycle, object : CallBack {
            override fun update(string: String) {
                Toast.makeText(this@LifeCyclerActivity, string, Toast.LENGTH_SHORT).show()
            }
        })
lifecycle.addObserver(myObserver)
  • 在生命周期中设置相应的标记

在OnCreate中配置onCreate的标记

     lifecycleRegistry.markState(Lifecycle.State.CREATED)
添加其他生命周期回调
override fun onResume() {
        super.onResume()
        lifecycleRegistry.markState(Lifecycle.State.RESUMED)
    }


    override fun onDestroy() {
        super.onDestroy()
        lifecycleRegistry.markState(Lifecycle.State.DESTROYED)
    }

四、生命周期感知组件的最佳实践

  • 保持UI控制器(活动和片段)尽可能瘦。他们不应该试图获取他们自己的数据;相反,使用VIEW模型来做这件事,并观察LiveData 对象,以将更改反映回视图
  • 尝试编写数据驱动的UI,其中UI控制器的职责是在数据更改时更新视图,或将用户操作通知回VIEW模型。
  • 将数据逻辑放在VIEW模型类中。VIEW模型应充当UI控制器和应用程序其余部分之间的连接器。
  • 使用数据绑定来维护视图和UI控制器之间的干净接口。如BufferKnife
  • 如果UI复杂,请考虑创建一个演示器类来处理UI修改。
  • 避免引用VIEW模型中的视图或活动上下文

五、停止事件处理

  • 当生命周期属于AppCompatActivity or Fragment时,生命周期的状态将更改为创建,当活动的onSaveInstanceState()被调用时,onStop将被调用
  • 当通过onSaveInstanceState()保存活动状态时,其UI被认为是不可变的,直到调用ON_START,尝试在保存状态后修改用户界面可能会导致应用程序的导航状态不一致,这就是为什么如果应用程序在状态保存后运行FragmentTransaction时FragmentManager会抛出异常
  • AppCompatActivity的onStop()方法是在onSaveInstanceState()之后调用的,它留下了一个不允许UI状态改变的间隙,但是生命周期还没有被移动到创建的状态,为了防止这个问题,版本BETA2和Lead中的生命周期类标记了未创建事件的CREATED状态,以便检查当前状态的任何代码获得真正的值,即使事件没有被系统调用,直到onStop()被调用
不幸的是,这个解决方案有两个主要问题:
  1. 在API级别23和更低的情况下,Android系统实际上保存了活动的状态,即使它被另一个活动部分覆盖。换句话说,Android系统调用onSaveInstanceState() ,但它不一定调用onStop()。这就形成了一个潜在的长间隔,观察者仍然认为生命周期是活动的,即使它的UI状态不能被修改。
  2. 任何想要向LIFEDATA类公开类似行为的类都必须实现生命周期版本beta 2和更低版本提供的解决方案。
  3. 为了使该流程更简单,并提供与旧版本更好的兼容性,从版本1.0.0 RC1开始,当onSaveInstanceState()被调用时,生命周期对象被标记为 CREATED和ON_STOP的将被发送,而不等待调用OnStop()方法






猜你喜欢

转载自blog.csdn.net/Alexwll/article/details/80638905
今日推荐