Jetpack-Lifecycle简记

Posted Android-kongqw

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Jetpack-Lifecycle简记相关的知识,希望对你有一定的参考价值。

Jetpack-Lifecycle简记

解决痛点:帮助开发者更方便的管理生命周期

和传统方式对比:

如果把Activity比作一个老父亲,页面中的子控件比作他的孩子的话。传统的方式,为了防止内存泄漏,老父亲要在生命周期方法中做一系列的管理,如果处理不当或者遗漏,就会因为这些孩子造成内存泄漏。老父亲就要给这些孩子擦屎把尿,帮助这些孩子,给他们在onStart()的时候要干啥,在onResume()的时候干啥等等。

Lifecycle 解决的痛点问题就是,父亲不再给这些孩子处理这些问题,只是把自己(Activity)的生命周期告诉孩子,至于孩子应该做什么,要他自己处理。

举一个列子:

  1. 创建一个孩子,实现LifecycleObserver接口,让他具备接收父亲生命周期变化的能力

Kotlin

import android.content.Context
import android.util.AttributeSet
import android.util.Log
import android.view.View
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.LifecycleObserver
import androidx.lifecycle.OnLifecycleEvent

/**
 * 假装是一个视频播放器
 */
class VideoPlayerView(context: Context?, attrs: AttributeSet?) : View(context, attrs), LifecycleObserver 

    @OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
    fun onFatherCreate() 
        Log.i("VideoPlayerView", "onFatherCreate() 页面创建好了,开始初始化")
    

    @OnLifecycleEvent(Lifecycle.Event.ON_START)
    fun onFatherStart() 
        Log.i("VideoPlayerView", "onFatherStart()")
    

    @OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
    fun onFatherResume() 
        Log.i("VideoPlayerView", "onFatherResume() 页面显示了,开始播放")
    

    @OnLifecycleEvent(Lifecycle.Event.ON_STOP)
    fun onFatherStop() 
        Log.i("VideoPlayerView", "onFatherStop()")
    


    @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
    fun onFatherPause() 
        Log.i("VideoPlayerView", "onFatherPause() 页面隐藏了,暂停播放")
    


    @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
    fun onFatherDestroy() 
        Log.i("VideoPlayerView", "onFatherDestroy() 页面销毁了,释放资源,防止内存泄漏")
    


    @OnLifecycleEvent(Lifecycle.Event.ON_ANY)
    fun onFatherAny() 
        // Log.i("VideoPlayerView", "onFatherAny() 父亲的生命发生了变化")
    

  1. 老父亲把生命周期告诉孩子

Kotlin

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

    lifecycle.addObserver(video_player_view)

  1. 运行:
I/VideoPlayerView: onFatherCreate() 页面创建好了,开始初始化
I/VideoPlayerView: onFatherStart()
I/VideoPlayerView: onFatherResume() 页面显示了,开始播放
I/VideoPlayerView: onFatherPause() 页面隐藏了,暂停播放
I/VideoPlayerView: onFatherStop()
I/VideoPlayerView: onFatherDestroy() 页面销毁了,释放资源,防止内存泄漏

--------- 2022年02月17日 更新 -----------

implementation 'androidx.appcompat:appcompat:1.4.1'

appcompat:1.4.1版本@OnLifecycleEvent过时,推荐使用DefaultLifecycleObserverLifecycleEventObserver

Annotation that can be used to mark methods on @link LifecycleObserver implementations that should be invoked to handle lifecycle events.
@deprecated This annotation required the usage of code generation or reflection, which should be avoided. Use @link DefaultLifecycleObserver or @link LifecycleEventObserver instead.

例:

class CustomView2(context: Context, attrs: AttributeSet?) : ConstraintLayout(context, attrs), DefaultLifecycleObserver 

    override fun onCreate(owner: LifecycleOwner) 
        super.onCreate(owner)
        Log.i("CustomView2", "onParentCreate")
    

    override fun onResume(owner: LifecycleOwner) 
        super.onResume(owner)
        Log.i("CustomView2", "onResume")
    

class CustomView3(context: Context, attrs: AttributeSet?) : ConstraintLayout(context, attrs), LifecycleEventObserver 

    override fun onStateChanged(source: LifecycleOwner, event: Lifecycle.Event) 
        Log.i("CustomView3", "onStateChanged($source, $event)")
    

以上是关于Jetpack-Lifecycle简记的主要内容,如果未能解决你的问题,请参考以下文章

关于Debian的一些简记

Rust 宏简记 - 以 vec! 为例

异常和trycatchfinally的简记

《中国IT产业发展报告(2016-2017)》_主编李颖 简记

python面向对象的简记

《原创视频》牛腩学docker简记