Lifecycle 与 Livedata 技术

幻昼 2021年11月15日 971次浏览

Lifecycle

是什么

一般 Lifecycle + LifecycleOwner + LifecycleObserver 结合使用

Lifecycle 是一个表示android生命周期及状态的对象
LifecycleOwner   用于连接有生命周期的对象,如 activity, fragment
LifecycleObserver 用于观察查LifecycleOwner

作用:Lifecycle 可以有效的避免内存泄漏和解决android生命周期的常见难题

基本使用

实现被观察者

abstract class MyBaseObservable : LifecycleOwner {

    private val mLifecycleRegistry = LifecycleRegistry(this)

    override fun getLifecycle(): Lifecycle {
        return mLifecycleRegistry
    }

    open fun onCreated() {
        mLifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_CREATE)
    }

    open fun onDestroy() {
        mLifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_DESTROY)
    }

    // ...
}

Activity, Fragment 都实现了 LifecycleOwner,跳过这一步。

实现观察者

class MyObserver : LifecycleObserver {

    @OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
    fun onCreated() {
        Log.e("TAG-jin", "onCreated: Lifecycle.Event.ON_CREATE")
    }
}

绑定、触发

class MyObservable : MyBaseObservable() {
    init {
        lifecycle.addObserver(MyObserver())
    }

    override fun onCreated() {
        super.onCreated()

        Log.i("TAG-jin", "onCreated: doSomething")
    }
}

核心原理

添加观察者、触发

类图

lifecycle-class

活动图

lifecycle-activity

状态机流转

lifecycle-state-machine

LiveData

是什么

一般 LifecycleOwner + ViewModel + LiveData + Observer 结合使用

LiveData 是一种具有生命周期感知能力的可观察数据持有类
LiveData 可以保证屏幕上的显示内容和数据一直保持同步

特点:LiveData 了解UI界面的状态,如果activity不在屏幕上显示,livedata不会触发没必要的界面更新,如果activity已经被销毁,会自动清空与observer的连接,意外的调用就不会发生

基本使用

依赖

    // ViewModel
    implementation("androidx.lifecycle:lifecycle-viewmodel-ktx:2.1.0")
    implementation 'androidx.fragment:fragment-ktx:1.3.6'
    // LiveData
    implementation("androidx.lifecycle:lifecycle-livedata-ktx:2.1.0")

定义 ViewModel

class NameViewModel : ViewModel() {

    var currentName: MutableLiveData<String> = MutableLiveData("jin")

}

使用 ViewModel

class NameActivity : AppCompatActivity() {

    // 引入 ViewModel
    private val viewModel: NameViewModel by viewModels()

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_name)

        val btn = findViewById<Button>(R.id.btn)
        val tv = findViewById<TextView>(R.id.tvText)

        // liveDate 改变后观察者回调
        viewModel.currentName.observe(this) { name ->
            tv.text = name
        }

        // 改变值
        btn.setOnClickListener {
            viewModel.currentName.value += "1"

            viewModel.currentName.postValue("111")
        }

    }
}

核心原理

liveData 感应 lifecycleOwner

liveData 发消息给 observer,setValue/postValue 过程

类图

livedata-class

活动图

livedata-activity


问题

  1. 别人想要监听Activity 的生命周期怎么实现

    • 定义一个接口,接口里面也有对应的生命周期方法,Activity 持有这个接口,当Activity触发生命周期时,调用接口对应的方法。(缺点:耦合度高,代码重复量太多)
    • 改进:观察者模式。 Activity:被观察者, 监听的类:观察者。Activity 生命周期发生变化,就通知观察者。
      Observer-Pattern-demo