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")
}
}
核心原理
添加观察者、触发
类图
活动图
状态机流转
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 过程
类图
活动图
问题
-
别人想要监听Activity 的生命周期怎么实现
- 定义一个接口,接口里面也有对应的生命周期方法,Activity 持有这个接口,当Activity触发生命周期时,调用接口对应的方法。(缺点:耦合度高,代码重复量太多)
- 改进:观察者模式。 Activity:被观察者, 监听的类:观察者。Activity 生命周期发生变化,就通知观察者。