0
点赞
收藏
分享

微信扫一扫

Jetpeck LifeCycle上手实践

Jetpeck LifeCycle上手实践demo

一、问题背景

在安卓开发日常中,我们经常有些场景是和activity或者application的生命周期相关的,这部分实现一般我们都会直接写在对应声明周期的方法中,比如写在oncreate函数等等。这样的话代码的耦合性就会比较高,并且这类代码多起来的话就会显得很冗余。这时候我们就可以使用到jetpeck提供的lifecycle组件,使得代码更有条理性、精简、易于维护。

二、问题分析

假设我们有一个在屏幕上显示设备位置的 Activity,实现起来的话可能像下面代码一样:

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

class MyActivity : AppCompatActivity() {
    private lateinit var myLocationListener: MyLocationListener

    override fun onCreate(...) {
        myLocationListener = MyLocationListener(this) { location ->
            // update UI
        }
    }

    public override fun onStart() {
        super.onStart()
        myLocationListener.start()
        // manage other components that need to respond
        // to the activity lifecycle
    }

    public override fun onStop() {
        super.onStop()
        myLocationListener.stop()
        // manage other components that need to respond
        // to the activity lifecycle
    }
}

这个场景就是直接在Activity 或 Fragment 的生命周期方法中直接对组件进行操作。这样写的话会导致代码显得冗余且不易扩展。那么使用Lifecycle,可以将***依赖组件的代码从Activity/Fragment生命周期方法中移入组件本身中。***

三、实现demo

1)对应module的gradle文件添加对应依赖

dependencies {
    ...
    def room_version = "2.4.2"
    implementation "androidx.lifecycle:lifecycle-runtime-ktx:$room_version"
    ...
}

2)定义LifeCycleObserver类

import android.util.Log
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.LifecycleObserver
import androidx.lifecycle.LifecycleOwner
import androidx.lifecycle.OnLifecycleEvent

open class MyLifeCycleObserver : LifecycleObserver {
    private val TAG : String = "MyLifeCycleDemoObserver"

    @OnLifecycleEvent(value = Lifecycle.Event.ON_START)
    fun connect(owner: LifecycleOwner) {
        Log.e(TAG, "Lifecycle.Event.ON_CREATE:connect")
    }

    @OnLifecycleEvent(value = Lifecycle.Event.ON_STOP)
    fun disConnect() {
        Log.e(TAG, "Lifecycle.Event.ON_DESTROY:disConnect")
    }
}

3)在我们的activity中添加自定义的LifeCycleObserver对象

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.util.Log

class LifeCycleActivity : AppCompatActivity() {
    private val TAG : String = "LifeCycleDemoActivity"

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

        Log.d(TAG, "onCreate")
        // 添加lifecycle的观察者
        lifecycle.addObserver(MyLifeCycleObserver())
    }

    override fun onStop() {
        super.onStop()
        Log.d(TAG, "onStop")
    }
}

4)进入和退出我们的activity,***测试log***如下: image.png

四、问题总结

使用jetpeck提供的lifecycle可以帮我们把声明周期相关的代码抽取到具体的组件对象中,避免了activity或者application等类的生命周期方法中代码过于冗余和耦合,增强代码之间的隔离和彼此的封装性,便于扩展和修改代码。

举报

相关推荐

0 条评论