是时候更新手里的武器了—Jetpack架构组件简析( 三 )

简单说明下 , 首先通过bind_refreshing属性 , 将数据viewModel.refreshing绑定到view上 , 这样数据变化 , view也会跟着变化 。然后view变化的时候 , 通过InverseBindingAdapter注释 , 会调用bind_refreshingChanged事件 , 而bind_refreshingChanged事件告诉了我们view什么时候会进行数据的修改 , 在这个案例中也就是swipeRefreshLayout下滑的时候会导致数据进行改变 , 于是数据对象会从isSwipeRefreshLayoutRefreshing方法获取到最新的数值 , 也就是从view更新过来的数据 。
这里要注意的一个点是 , 双向绑定要考虑到死循环问题 , 当View被改变 , 数据对象对应发生更新 , 同时 , 这个更新又回通知View层去刷新UI , 然后view被改变又会导致数据对象更新 , 无限循环下去了 。所以防止死循环的做法就是判断view的数据状态 , 当发生改变的时候才去更新view 。
Lifecycles

生命周期感知型组件可执行操作来响应另一个组件(如 Activity 和 Fragment)的生命周期状态的变化 。这些组件有助于您写出更有条理且往往更精简的代码 , 这样的代码更易于维护 。
Lifecycles , 称为生命周期感知型组件 , 可以感知和响应另一个组件(如 Activity 和 Fragment)的生命周期状态的变化 。
可能有人会疑惑了 , 生命周期就那几个 , 我为啥还要导入一个库呢?有了库难道就不用写生命周期了吗 , 有什么好处呢? 举个 , 让你感受下 。
首先导入库 , 可以根据实际项目情况导入
// ViewModelimplementation "androidx.lifecycle:lifecycle-viewmodel-ktx:$lifecycle_version"// LiveDataimplementation "androidx.lifecycle:lifecycle-livedata-ktx:$lifecycle_version"// Lifecycles only (without ViewModel or LiveData)implementation "androidx.lifecycle:lifecycle-runtime-ktx:$lifecycle_version"//.......现在有一个定位监听器 , 需要在Activity启动的时候开启 , 销毁的时候关闭 。正常代码如下:
class BindingActivity : AppCompatActivity() {private lateinit var myLocationListener: MyLocationListeneroverride fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)myLocationListener = MyLocationListener(this) { location ->// update UI}}public override fun onStart() {super.onStart()myLocationListener.start()}public override fun onStop() {super.onStop()myLocationListener.stop()}internal class MyLocationListener(private val context: Context,private val callback: (Location) -> Unit) {fun start() {// connect to system location service}fun stop() {// disconnect from system location service}}}乍一看也没什么问题是吧 , 但是如果需要管理生命周期的类一多 , 是不是就不好管理了 。所有的类都要在Activity里面管理 , 还容易漏掉 。所以解决办法就是实现解耦 , 让需要管理生命周期的类自己管理 , 这样Activity也不会遗漏和臃肿了 。上代码:
override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)myLocationListener = MyLocationListener(this) { location ->// update UI}lifecycle.addObserver(myLocationListener)}internal class MyLocationListener (private val context: Context,private val callback: (Location) -> Unit): LifecycleObserver {@OnLifecycleEvent(Lifecycle.Event.ON_START)fun start() {}@OnLifecycleEvent(Lifecycle.Event.ON_STOP)fun stop() {// disconnect if connected}}很简单吧 , 只要实现LifecycleObserver接口 , 就可以用注释的方式执行每个生命周期要执行的方法 。然后在Activity里面addObserver绑定即可 。
同样的 , Lifecycle也支持自定义生命周期 , 只要继承LifecycleOwner即可 , 然后通过markState方法设定自己类的生命周期 , 举个
class BindingActivity : AppCompatActivity(), LifecycleOwner {private lateinit var lifecycleRegistry: LifecycleRegistryoverride fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)lifecycleRegistry = LifecycleRegistry(this)lifecycleRegistry.markState(Lifecycle.State.CREATED)}public override fun onStart() {super.onStart()lifecycleRegistry.markState(Lifecycle.State.STARTED)}}LiveData
LiveData 是一种可观察的数据存储器类 。与常规的可观察类不同 , LiveData 具有生命周期感知能力 , 意指它遵循其他应用组件(如 Activity、Fragment 或 Service)的生命周期 。这种感知能力可确保 LiveData 仅更新处于活跃生命周期状态的应用组件观察者 。


推荐阅读