【Android JetPack系列】LifeCycles

原创
2019/10/24 13:23
阅读数 159

一、简介

Lifecycles 是一个持有组件生命周期状态(如活动或片段)信息的类,并允许其他对象观察此状态。

生命周期使用两个主要枚举来跟踪其关联组件的生命周期状态:

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

二、以前的做法

Lifecycles:生命周期感知组件,从名字中就可以知道,这个方法是处理生命周期的相关的操作

这个库从系统框架层去管理具有生命周期的组件,例如 activity, fragment。让开发更方便地去管理自己应用里需要和 activity或者fragment绑定的组件,让代码更容易维护。

通常情况下,我们在对应的生命周期方法中直接处理相应的业务逻辑。例如:需要在每个周期Toast周期的名字,那我们就要在每个周期方法中调用:

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](https://my.oschina.net/u/1162528)
    override fun  onStart() {
        super.onStart();
        Util.checkUserStatus(result -> {
            if (result) {
                myLocationListener.start();
            }
        });
    }
 
    [@Override](https://my.oschina.net/u/1162528)
    override fun  onStop() {
        super.onStop();
        myLocationListener.stop();
    }
}

上述是我们平时开发最常用的接口方法,这样做虽然也很方便,但这种模式导致代码的高度耦合,并且通常我们希望实现重量更轻的代码,这些代码更易于维护,下面我们来看看LifeCycles的使用。

三、LifeCycles 的使用

1、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"

2、创建 MyObserver, 继承 LifecycleObserver

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)
    }
}
  • 传入LifecyclesCallbackLifecycles为绑定Activity的生命周期,CallBack用于处理数据后的回调
  • 使用注解在每个方法上标记相应的生命周期

3、Implementing a custom LifecycleOwner

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

class LifeCyclerActivity : AppCompatActivity(), LifecycleOwner {

}

3.2、创建LifecycleRegistry,并返回lifecycleRegistry

lateinit var lifecycleRegistry: LifecycleRegistry

lifecycleRegistry = LifecycleRegistry(this)

override fun getLifecycle(): Lifecycle {
    return lifecycleRegistry
}

3.3、实例化创建 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)

3.4、在生命周期中设置相应的标记

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)
}

3.5、总结(简化)

如果你点击到SupportActivity中查看的话,会发现SupportActivity本身就实现了LifecycleOwnerLifecyclerActivity中的很多操作都已经在SupportActivity中完成了,那么上述的使用可以直接更简化为:

 class LifeCyclerActivity : AppCompatActivity() {
     
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(R.layout.activity_life_cycler)
     
     
            var myObserver = MyObserver(lifecycle, object : CallBack {
                override fun update() {
                    Toast.makeText(this@LifeCyclerActivity, "Toast", Toast.LENGTH_SHORT).show()
                }
            })
            lifecycle.addObserver(myObserver)
      }
    }

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

  • 保持UI控制器(活动和片段)尽可能,不应该在活动或片段中直接获取数据;相反,使用VIEW模型来做这件事,并观察LiveData 对象,以将更改反映回视图.

  • 尝试编写数据驱动的UI,其中UI控制器的职责是在数据更改时更新视图,或将用户操作通知回VIEW模型。

  • 将数据逻辑放在VIEW模型类中。VIEW模型应充当UI控制器和应用程序其余部分之间的连接器。

  • 使用数据绑定来维护视图和UI控制器之间的干净接口。如BufferKnife 避免引用VIEW模型中的视图或活动上下文

可参考

展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部