Android Jetpack库剖析之Lifecycle组件篇

目录
  • 提纲
  • 什么是Lifecycle
  • 如何使用Lifecycle
  • 关系梳理
  • Activity是如何实现Lifecycle的
    • CompatActivity
    • AppCompatActivity
  • Fragment是如何实现Lifecycle的
  • Lifecycle是如何下发宿主生命周期给观察者的

提纲

1,什么是Lifecycle?

2,如何使用Lifecycle?

3,LifecycleOwner,Lifecycle,LifecycleObserver之间是什么关系?

3,Activity是如何实现Lifecycle的?

4,Fragment是如何实现Lifecycle的?

5,Lifecycle是如何下发宿主生命周期给观察者的?

什么是Lifecycle

Lifecycle是Jetpack组件库中的架构组件,顾名思义就是一个生命周期组件,它可感知宿主的生命周期,并根据生命周期反推出生命周期所属的状态下发给观察者。

如何使用Lifecycle

1,实现其生命周期回调接口,成为生命周期观察者

2,在Activity/Fragment中获取Lifecycle实例并添加观察者

3,实例代码如下,个人比较推荐第一种方式,第二种方式比较繁琐,需要在方法上通过注解来表明想要观察的生命周期事件

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        //订阅生命周期
        lifecycle.addObserver(MyLifecycleEventObserver())
        lifecycle.addObserver(MyLifecycleObserver())
    }
    /**
     * 方式一(个人比较推荐)
     */
    class MyLifecycleEventObserver : LifecycleEventObserver {
        override fun onStateChanged(source: LifecycleOwner, event: Lifecycle.Event) {
            when (event) {
                Lifecycle.Event.ON_CREATE -> println("onCreate")
                Lifecycle.Event.ON_START -> println("onStart")
                Lifecycle.Event.ON_RESUME -> println("onResume")
                Lifecycle.Event.ON_PAUSE -> println("onPause")
                Lifecycle.Event.ON_STOP -> println("onStop")
                Lifecycle.Event.ON_DESTROY -> println("onDestroy")
            }
        }
    }
    /**
     * 方式二
     */
    class MyLifecycleObserver : LifecycleObserver {
        @OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
        fun onCreate(event: Lifecycle.Event) {
            println("onCreate")
        }
        @OnLifecycleEvent(Lifecycle.Event.ON_START)
        fun onStart(event: Lifecycle.Event) {
            println("onStart")
        }
        @OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
        fun onResume(event: Lifecycle.Event) {
            println("onResume")
        }
    }
}

关系梳理

LifecycleOwner,Lifecycle,LifecycleObserver之间是什么关系?

1,LifecycleOwner:生命周期持有者,我们的Activity/Fragment都实现了这个接口并重写了它的抽象方法getLicycle()返回一个Licycle实例。

2,Lifecycle:LifecycleRegsitry是它的唯一实现类,主要用来负责注册观察者,下发宿主状态给观察者

3,LicycleObserver:是一个接口,主要用来接收宿主的生命周期状态,实现该接口即可成为一个生命周期观察者

4,他们之间的持有关系如下图:

Activity是如何实现Lifecycle的

CompatActivity

如果我们的Activity是继承自CompatActivity,那么CompatActivity需要在Activity上添加一个ReportFragment来实现生命周期下发

(1)在CompatActivity中创建LifecycleRegistry类型的成员变量mLifecycleRegistry

(2)在CompatActivity的onCreate()方法中往Activity中添加一个ReportFragment来下发命周期

public class ComponentActivity extends androidx.core.app.ComponentActivity implements
        LifecycleOwner,
        ViewModelStoreOwner,
        SavedStateRegistryOwner,
        OnBackPressedDispatcherOwner {
    //创建Lifecycle实例
    private final LifecycleRegistry mLifecycleRegistry = new LifecycleRegistry(this);
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mSavedStateRegistryController.performRestore(savedInstanceState);
        //往Activity添加一个ReportFragment来达到下发生命周期的目的
        ReportFragment.injectIfNeededIn(this);
        if (mContentLayoutId != 0) {
            setContentView(mContentLayoutId);
        }
    }
}

(3) 将Fragment与Activity进行绑定,添加到Activity中,用于感知Activity生命周期变化

(4)当Activity生命周期发生变化,对应的生命周期回调方法被调用,下发生命周期给观察者

public class ReportFragment extends Fragment {
    public static void injectIfNeededIn(Activity activity) {
        //往Activity中存放一个ReportFragment
        android.app.FragmentManager manager = activity.getFragmentManager();
        if (manager.findFragmentByTag(REPORT_FRAGMENT_TAG) == null) {
            manager.beginTransaction().add(new ReportFragment(), REPORT_FRAGMENT_TAG).commit();
            // Hopefully, we are the first to make a transaction.
            manager.executePendingTransactions();
        }
    }
    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        dispatchCreate(mProcessListener);
        dispatch(Lifecycle.Event.ON_CREATE);
    }
    @Override
    public void onStart() {
        super.onStart();
        dispatchStart(mProcessListener);
        dispatch(Lifecycle.Event.ON_START);
    }
    @Override
    public void onResume() {
        super.onResume();
        dispatchResume(mProcessListener);
        dispatch(Lifecycle.Event.ON_RESUME);
    }
    @Override
    public void onPause() {
        super.onPause();
        dispatch(Lifecycle.Event.ON_PAUSE);
    }
    @Override
    public void onStop() {
        super.onStop();
        dispatch(Lifecycle.Event.ON_STOP);
    }
    @Override
    public void onDestroy() {
        super.onDestroy();
        dispatch(Lifecycle.Event.ON_DESTROY);
        // just want to be sure that we won't leak reference to an activity
        mProcessListener = null;
    }
    /**
     * 下发生命周期事件
     */
    private void dispatch(Lifecycle.Event event) {
        //获取Activity的Lifecycle实例,下发生命周期事件
        Activity activity = getActivity();
        if (activity instanceof LifecycleRegistryOwner) {
            ((LifecycleRegistryOwner) activity).getLifecycle().handleLifecycleEvent(event);
            return;
        }
        if (activity instanceof LifecycleOwner) {
            Lifecycle lifecycle = ((LifecycleOwner) activity).getLifecycle();
            if (lifecycle instanceof LifecycleRegistry) {
                ((LifecycleRegistry) lifecycle).handleLifecycleEvent(event);
            }
        }
    }
}

AppCompatActivity

如果我们的Activity是继承自AppCompatActivity ,不需要往Activity中添加一个ReportFragment来感知生命周期并下发生命周期事件,AppCompatActivity 继承自FragmentActivity,下发生命周期事件都在FragmentActivity的生命周期回调方法中进行

(1)创建LifecycleRegistry类型的变量mFragmentLifecycleRegistry

(2)在其生命周期回调方法中调用mFragmentLifecycleRegistry的handlerLifecycleEvent()方法进行下发生命周期事件

public class FragmentActivity extends ComponentActivity implements
        ActivityCompat.OnRequestPermissionsResultCallback,
        ActivityCompat.RequestPermissionsRequestCodeValidator {
    //创建Lifecycle实例
    final LifecycleRegistry mFragmentLifecycleRegistry = new LifecycleRegistry(this);
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        //下发生命周期事件
        mFragmentLifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_CREATE);
    }
        @Override
    protected void onDestroy() {
        super.onDestroy();
        mFragments.dispatchDestroy();
        //下发生命周期事件
        mFragmentLifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_DESTROY);
    }
    @Override
    protected void onPause() {
        super.onPause();
        mResumed = false;
        mFragments.dispatchPause();
        //下发生命周期事件
        mFragmentLifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_PAUSE);
    }
    protected void onResumeFragments() {
        //下发生命周期事件
        mFragmentLifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_RESUME);
        mFragments.dispatchResume();
    }
}

Fragment是如何实现Lifecycle的

其实Fragment实现Lifecycle,下发其生命周期的操作跟AppCompatActivity 是一样的套路,在其生命周期回调方法中进行生命周期事件下发

(1)创建Fragment时调用initLifecycle()方法给LifecycleRegistry类型的mLifecycleRegistry变量赋值

(2)在其生命周期回调方法中调用mLifecycleRegistry的handlerLifecycleEvent()方法下发生命周期事件给观察者

public class Fragment implements ComponentCallbacks, OnCreateContextMenuListener, LifecycleOwner,
        ViewModelStoreOwner, SavedStateRegistryOwner {
    LifecycleRegistry mLifecycleRegistry;
    public Fragment() {
        initLifecycle();
    }
    private void initLifecycle() {
        //创建Lifecycle实例
        mLifecycleRegistry = new LifecycleRegistry(this);
    }
    void performCreate(Bundle savedInstanceState) {
        onCreate(savedInstanceState);
        //下发生命周期事件给观察者
        mLifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_CREATE);
    }
    void performStart() {
        onStart();
        //下发生命周期事件给观察者
        mChildFragmentManager.dispatchStart();
    }
    void performResume() {
        onResume();
        //下发生命周期事件给观察者
        mLifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_RESUME);
    }
}

Lifecycle是如何下发宿主生命周期给观察者的

(1)在我们调用Lifecycle的addObserver()方法时就已经开始下发生命周期事件了,接下来让我们先从addObserver()这个入口看看其实现逻辑,大致逻辑如下

public class LifecycleRegistry extends Lifecycle {
    @Override
    public void addObserver(@NonNull LifecycleObserver observer) {
        //首次添加观察者,如果宿主状态不是DESTROYED,那么观察者初始状态都是INITIALIZED
        State initialState = mState == DESTROYED ? DESTROYED : INITIALIZED;
        //把传进去的生命周期观察者以及初始状态包装成ObserverWithState对象
        ObserverWithState statefulObserver = new ObserverWithState(observer, initialState);
        //把包装好的ObserverWithState对象存放到观察者集合中,如果此前已经添加过则会返回此前添加的值,否则返回null
        ObserverWithState previous = mObserverMap.putIfAbsent(observer, statefulObserver);
        //判断此前是否添加过,如果添加过则直接结束方法
        if (previous != null) {
            return;
        }
        //获取宿主实例
        LifecycleOwner lifecycleOwner = mLifecycleOwner.get();
        if (lifecycleOwner == null) {
            // it is null we should be destroyed. Fallback quickly
            return;
        }
        //计算观察者的目标状态
        State targetState = calculateTargetState(observer);
        //循环比对观察者的状态和宿主的状态,如果没有对齐则下发对应的生命周期事件
        //拿观察者的状态和宿主的状态做比较 如果小于0代表状态还没有对齐,需要继续下发生命周期状态给观察者
        //假设是在Activity的onResume()方法中注册的观察者,那么就需要给观察者下发onCreate,onStart,onResume这些事件
        while ((statefulObserver.mState.compareTo(targetState) < 0
                && mObserverMap.contains(observer))) {
            pushParentState(statefulObserver.mState);
            statefulObserver.dispatchEvent(lifecycleOwner, upEvent(statefulObserver.mState));
            popParentState();
            // mState / subling may have been changed recalculate
            targetState = calculateTargetState(observer);
        }
    }
}

(2)分析完addObserver()做了哪些事,那么我们再来分析下handlerLifecycleEvent()方法做了什么事

public class LifecycleRegistry extends Lifecycle {
    public void handleLifecycleEvent(@NonNull Lifecycle.Event event) {
        //根据生命周期事件推算出其状态
        State next = getStateAfter(event);
        //移动到新状态
        moveToState(next);
    }
    private void moveToState(State next) {
        //如果当前状态和新状态相等 结束方法
        if (mState == next) {
            return;
        }
        //记录新状态
        mState = next;
        //如果当前正在下发生命周期事件 或 当前正在添加观察者 结束方法
        if (mHandlingEvent || mAddingObserverCounter != 0) {
            mNewEventOccurred = true;
            return;
        }
        //同步新状态给观察者
        mHandlingEvent = true;
        sync();
        mHandlingEvent = false;
    }
    private void sync() {
        //获取宿主实例
        LifecycleOwner lifecycleOwner = mLifecycleOwner.get();
        //停止循环的条件是已经同步状态完成 或 没有观察者
        while (!isSynced()) {
            mNewEventOccurred = false;
            //获取观察者集合中最先添加的那个元素 拿当前状态和观察者状态作比较 判断当前是不是向后移动状态 STARTED -> ON_STOP
            if (mState.compareTo(mObserverMap.eldest().getValue().mState) < 0) {
                backwardPass(lifecycleOwner);
            }
            //获取观察者集合中最新添加的那个元素 拿当前状态和观察者状态作比较 判断当前是不是向前移动状态 STARTED -> ON_RESUME
            Entry<LifecycleObserver, ObserverWithState> newest = mObserverMap.newest();
            if (!mNewEventOccurred && newest != null
                    && mState.compareTo(newest.getValue().mState) > 0) {
                forwardPass(lifecycleOwner);
            }
        }
        mNewEventOccurred = false;
    }
    /**
     * 向前移动状态
     */
    private void forwardPass(LifecycleOwner lifecycleOwner) {
        Iterator<Entry<LifecycleObserver, ObserverWithState>> ascendingIterator =
                mObserverMap.iteratorWithAdditions();
        //遍历所有观察者
        while (ascendingIterator.hasNext() && !mNewEventOccurred) {
            Entry<LifecycleObserver, ObserverWithState> entry = ascendingIterator.next();
            ObserverWithState observer = entry.getValue();
            //拿观察者的状态和宿主的状态做比较 如果小于0代表状态还没有对齐
            //假设当前宿主在RESUMED状态 观察者在CREATED状态 则需要下发:ON_START,ON_RESUME生命周期事件 需要循环两次
            while ((observer.mState.compareTo(mState) < 0 && !mNewEventOccurred
                    && mObserverMap.contains(entry.getKey()))) {
                pushParentState(observer.mState);
                //根据观察者状态反推向前移动事件 下发生命周期事件
                observer.dispatchEvent(lifecycleOwner, upEvent(observer.mState));
                popParentState();
            }
        }
    }
    /**
     * 通过观察者状态反推向前移动事件
     */
    private static Event upEvent(State state) {
        switch (state) {
            case INITIALIZED:
            case DESTROYED:
                return ON_CREATE;
            case CREATED:
                return ON_START;
            case STARTED:
                return ON_RESUME;
            case RESUMED:
                throw new IllegalArgumentException();
        }
        throw new IllegalArgumentException("Unexpected state value " + state);
    }
    /**
     * 向后移动状态
     */
    private void backwardPass(LifecycleOwner lifecycleOwner) {
        Iterator<Entry<LifecycleObserver, ObserverWithState>> descendingIterator =
                mObserverMap.descendingIterator();
        //遍历所有观察者
        while (descendingIterator.hasNext() && !mNewEventOccurred) {
            Entry<LifecycleObserver, ObserverWithState> entry = descendingIterator.next();
            ObserverWithState observer = entry.getValue();
            //拿观察者的状态和宿主的状态做比较 如果大于0代表状态还没有对齐
            //假设当前观察者在RESUMED状态 宿主在DESTROYED状态 那么需要下发:ON_PAUSE,ON_STOP,ON_DESTROY这些生命周期事件 循环三次
            while ((observer.mState.compareTo(mState) > 0 && !mNewEventOccurred
                    && mObserverMap.contains(entry.getKey()))) {
                //根据观察者状态反推出向后移动事件
                Event event = downEvent(observer.mState);
                pushParentState(getStateAfter(event));
                //下发该生命周期事件给观察者
                observer.dispatchEvent(lifecycleOwner, event);
                popParentState();
            }
        }
    }
    /**
     * 通过观察者状态反推向后移动的事件
     */
    private static Event downEvent(State state) {
        switch (state) {
            case INITIALIZED:
                throw new IllegalArgumentException();
            case CREATED:
                return ON_DESTROY;
            case STARTED:
                return ON_STOP;
            case RESUMED:
                return ON_PAUSE;
            case DESTROYED:
                throw new IllegalArgumentException();
        }
        throw new IllegalArgumentException("Unexpected state value " + state);
    }
}

(3)接下来我们看看ObserverWitchState的dispatchEvent()方法是如何下发生命周期事件给观察者的,我们知道在调用Lifecycle的addObserver()方法时就把我们传进去的LifecycleObserver封装成了一个ObserverWitchState对象,并存放到生命周期观察者集合中

static class ObserverWithState {
        //记录当前状态
        State mState;
        //生命周期观察者
        LifecycleEventObserver mLifecycleObserver;
        ObserverWithState(LifecycleObserver observer, State initialState) {
            mLifecycleObserver = Lifecycling.lifecycleEventObserver(observer);
            mState = initialState;
        }
        //下发生命周期事件给生命周期观察者
        void dispatchEvent(LifecycleOwner owner, Event event) {
            //根据生命周期事件推算出生命周期状态
            State newState = getStateAfter(event);
            mState = min(mState, newState);
            //调用生命周期观察者的onStateChanged()方法通知生命周期观察者生命周期发生变化
            mLifecycleObserver.onStateChanged(owner, event);
            mState = newState;
        }
}
static State getStateAfter(Event event) {
        switch (event) {
            case ON_CREATE:
            case ON_STOP:
                return CREATED;
            case ON_START:
            case ON_PAUSE:
                return STARTED;
            case ON_RESUME:
                return RESUMED;
            case ON_DESTROY:
                return DESTROYED;
            case ON_ANY:
                break;
        }
        throw new IllegalArgumentException("Unexpected event value " + event);
}

(4)到此结束,希望对读者有所帮助

到此这篇关于Android Jetpack库剖析之Lifecycle组件篇的文章就介绍到这了,更多相关Android Lifecycle内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Android Jetpack中Room的使用

    Room Room主要分三个部分 database.dao和实体类entity Entity entity实体类定义时需要用到@Entity(tableName = "student")注解,其中参数为表名 主键定义需要用到@PrimaryKey(autoGenerate = true)注解,参数决定是否自增长 每个属性(也就是表的字段)都需要加@ColumnInfo(name = "name",typeAffinity = ColumnInfo.TEXT)注解 ,

  • Android开发Jetpack组件WorkManager用例详解

    目录 一.简介 二.导入 三.基本使用 3.1 定义后台任务 3.2 配置任务运行条件 3.2.1 只需执行一次的任务 3.2.2 周期性执行的任务 3.3 将任务传给 WorkManager 四.高级配置 4.1 设置任务延迟执行 4.2 给任务添加标签 4.3 取消任务 4.3.1 根据标签取消任务 4.3.2 根据 request 的 id 取消任务 4.3.3 取消所有任务 4.4 任务重试 4.5 监听任务结果 4.6 传递数据 4.7 链式任务 一.简介 WorkManager 用于

  • Android Jetpack组件Navigation导航组件的基本使用

    目录 1.Navigation 基本概念 2.Navigation 使用入门 2.1 添加Navigation依赖 2.2 创建导航图 2.3 导航图中添加目的地Fragment 2.4 Activity添加 NavHost 2.5 LoginFragment 代码编写 2.6 welcomeFragment 代码编写 总结 本篇主要介绍一下 Android Jetpack 组件 Navigation 导航组件的 基本使用 当看到 Navigation单词的时候 应该就大概知道 这是一个关于导航

  • Android Jetpack Compose无限加载列表

    目录 前言 方法一: paging-compose 方法二:自定义实现 添加 LoadingIndicator 总结 前言 Android 中使用 ListView 或者 RecycleView 经常有滚动到底部自动 LoadMore 的需求,那么在 Compose 中该如何实现呢? 两种方法可供选择: 基于 paging-compose 自定义实现 方法一: paging-compose Jetpack 的 Paging 组件提供了对 Compose 的支持 dependencies { ..

  • Android Jetpack架构组件Lifecycle详解

    前言 Lifecycle是Jetpack架构组件中用来感知生命周期的组件,使用Lifecycles可以帮助我们写出和生命周期相关更简洁更易维护的代码. 生命周期 生命周期这个简单而又重要的知识相信大家早已耳熟能详.假设我们现在有这样一个简单需求: 这个需求只是一个实例,在真实的开发中当然不可能有这样的需要: 在Activity 可见的时候,我们去做一个计数功能,每隔一秒 将计数加1 ,当Activity不可见的时候停止计数,当Activity被销毁的时候 将计数置为0 OK,So easy~ ,

  • 详解Android JetPack之LiveData的工作原理

    前言 本篇文章主要讲解LiveData工作的原理,如果还不知道LiveData如何用的话,请参考官方文档. LiveData的讲解涉及到了Lifecycle的知识,如果你还不了解LifeCycle,请参考文档LifeCycle介绍. 介绍 LiveData是一个数据持有类,它可以通过添加观察者被其他组件观察其变更.不同于普通的观察者,它最重要的特性就是遵从应用程序的生命周期,如在Activity中如果数据更新了但Activity已经是destroy状态,LivaeData就不会通知Activit

  • Android开发Jetpack组件Room用例讲解

    目录 一.简介 二.导入 三.使用 3.1 创建 Entity 类 3.2 创建 Dao 类 3.3 创建 Database 抽象类 3.4 测试 四.数据库升级 4.1 简单升级 4.2 规范升级 4.2.1 新增一张表 4.2.2 修改一张表 4.3 测试 一.简介 Room 是 Google 官方推出的数据库 ORM 框架.ORM 是指 Object Relational Mapping,即对象关系映射,也就是将关系型数据库映射为面向对象的语言.使用 ORM 框架,我们就可以用面向对象的思

  • Android开发Jetpack组件DataBinding用例详解

    目录 简介 使用方式 1. build.gradle 中添加 kapt,并启用dataBinding 2.修改布局文件,添加 layout 和 data 标签 3.使用 DataBindingUtil 绑定布局 4.布局的 data 标签中添加数据变量,并使用其参数 5.BindingAdapter的使用 简介 DataBinding 是 Jetpack 组件之一,适用于 MVVM 模式开发,也是Google官方推荐使用的组件之一.使用DataBinding可以很容易的达到视图与逻辑分离,直接在

  • Android Jetpack Compose实现列表吸顶效果

    目录 stickyHeader 实体类 加载假数据 吸顶标题 二级条目 完整代码 效果图 安卓传统的 Recyclerview 打造悬浮头部StickyHeader的吸顶效果,十分麻烦,而在Compose中就简单多了 stickyHeader Compose设计的时候考虑得很周到,他们提供了stickyHeader 作用就是添加一个粘性标题项,即使在它后面滚动时也会保持固定.标头将保持固定,直到下一个标头取而代之. 参数key - 表示唯一的密钥键. 它不允许对列表出现使用相同的键.密钥的类型应

  • Android Jetpack库剖析之Lifecycle组件篇

    目录 提纲 什么是Lifecycle 如何使用Lifecycle 关系梳理 Activity是如何实现Lifecycle的 CompatActivity AppCompatActivity Fragment是如何实现Lifecycle的 Lifecycle是如何下发宿主生命周期给观察者的 提纲 1,什么是Lifecycle? 2,如何使用Lifecycle? 3,LifecycleOwner,Lifecycle,LifecycleObserver之间是什么关系? 3,Activity是如何实现L

  • Android Jetpack库剖析之ViewModel组件篇

    前言 今天让我们一起去探究一下ViewModel的实现原理,描述的不对或不足还请海涵,仅作为参考 ViewModel简介 ViewModel是一个可感知Activity或Fragment生命周期的一个架构组件,当视图销毁,数据也会被清除,所以它的本质就是用来存储与视图相关的数据,让视图显示控制与数据分离,即使界面配置发生改变数据也不会被销毁,通常配合LiveData使用 ViewModel用法 class MainActivity : AppCompatActivity() { override

  • Android Jetpack库剖析之LiveData组件篇

    目录 LiveData简介 LiveData用法 数据订阅过程 PostValue过程 SetValue过程 生命周期变化 LiveData简介 在日常安卓开发中,一些耗时的操比如列网络请求,数据库读写都不能在主线程执行,必须开一条子线程去执行这些耗时操作,但我们往往需要在这些耗时操作执行完毕后更新UI,但安卓不能在子线程进行UI的更新,这时我们只能通过创建一个Handler来切回到主线程进行UI的更新,直到LiveData出现,LiveData是一个可被观察的数据容器,它将数据包装起来,使数据

  • Android Jetpack库重要组件WorkManager的使用

    目录 前言 后台处理指南 后台处理面临的挑战 如何选择合适的后台解决方案 WorkManager概述 WorkManager使用 1 声明依赖项 2 自定义一个继承自Worker的类 3 选择worker执行的条件 4 下面贴出自定义worker类的全部源码 5 执行任务的方式 6 取消任务的执行 前言 WorkManager是Jetpack很重要的一个组件: 本篇我们就先来讲讲它是如何使用的,在讲解之前我们先了解关于后台处理的一些痛点 后台处理指南 我们知道每个 Android 应用都有一个主

  • Android Jetpack组件中LifeCycle作用详细介绍

    目录 Jetpack 1.那么Jetpack是什么呢 2.为何使用Jetpack 3.Jetpack与AndroidX LifeCycle 1.LifeCycle的作用 2.LifeCycle应用 1.设计组件 2.使用组件 3.总结LifeCycle的使用 Jetpack Jetpack,我觉得翻译为“飞行器”更好听,因为Google针对编程历史乱象,整理出一套组件库,帮助开发者创造更完美的应用作品.现在市面上,很多公司招聘面试要求渐渐把Jetpack看作必会技能,Google也在疯狂的安利J

  • Android开发Jetpack组件Lifecycle使用篇

    目录 1.为什么需要Lifecycle 2.如何使用Lifecycle 2.1 依赖Lifecycle库 2.2 Lifecycle基本用法 3.Lifecycle应用举例 3.1 Activity中使用 3.2 MVP中使用 4.自定义LifecycleOwner 1.为什么需要Lifecycle 在应用开发中,处理Activity或者Fragment组件的生命周期相关代码是必不可免的: 官方文档中举了一个例子,这里简化一下,在Activity中写一个监听,在Activity的不同生命周期方法

  • Android开发Jetpack组件Lifecycle原理篇

    目录 前言 1.Lifecycle的生命周期状态事件和状态 2.Lifecycle如何观察Activity和Fragment的生命周期 前言 在上一篇文章中,我们学习了如何去使用Lifecycle: 当然之会使用是不够的,还需要了解它的原理,这是成为优秀工程师必备的:这篇文章就来学习Lifecycle的基本原理 1.Lifecycle的生命周期状态事件和状态 **Lifecycle使用两个枚举来跟踪其关联组件的生命周期状态,这两个枚举分别是Event和State:**State指的是Lifecy

  • Android JetPack组件的支持库Databinding详解

    目录 简介 启用databinding 布局xml variable (变量标签) data (数据标签) @{}表达式 绑定普通数据 绑定可观察数据 对单个变量的绑定-fields 对集合的绑定-collections 绑定对象-objects 绑定LiveData 双向绑定 简介 DataBinding 是 Google 在 Jetpack 中推出的一款数据绑定的支持库,利用该库可以实现在页面组件中直接绑定应用程序的数据源.使其维护起来更加方便,架构更明确简介. DataBinding 唯一

  • Android Jetpack组件支持库DataBinding与ViewModel与LiveData及Room详解

    目录 一.官方推荐的Jetpack架构 二.添加依赖 三.创建Repository 四.创建ViewModel 五.activity中使用 Android Jetpack之ViewModel.LiveData Android Jetpack之LifeCycle 一.官方推荐的Jetpack架构 ViewModel是介于View(视图)和Model(数据模型)之间的中间层,能够使视图和数据分离,又能提供视图和数据之间的通信. LiveData是一个能够在ViewModel中数据发生变化时通知页面刷

随机推荐