android 架构组件Lifecycle、Livedata、Viewmodel讲解及使用

前言

在谷歌最新发布的android 架构组件中 添加了  Lifecycle,Livedata,Viewmodel 组件,这些组件对于android开发中有很大的使用价值,其实lifecycle用来管理 复杂的生命周期,Livedata 是一款基于观察者模式的组件,当 LiveData 所持有的数据改变时,它会通知相应的界面代码进行更新,同时,LiveData 持有界面代码 Lifecycle 的引用,这意味着它会在界面代码(LifecycleOwner)的生命周期处于 started 或 resumed 时作出相应更新,而在 LifecycleOwner 被销毁时停止更新。通过 LiveData,开发者可以方便地构建安全性更高、性能更好的高响应度用户界面.Viewmodel 是用来管理数据集的,通常配合LiveData一起使用,当model中数据发生改变,LiveData会做出相应的响应操作。

   接下来我来介绍一下 3个组件如何使用,及使用中的问题。

首先我们需要 导入 相应的 库

// android 架构组件
def lifecycle_version = "1.1.1"

// 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"

// optional - Test helpers for LiveData
testImplementation "android.arch.core:core-testing:$lifecycle_version"

Lifecycle 

Lifecycle 是一个持有组件(比如 activity 或者 fragment)生命周期状态信息的类,并且允许其它对象观察这个状态

使用lifecycle的好处在于它可以管理 应用界面的生命周期,以及把复杂的逻辑剥离出来,通常我们在开发中可能遇见 一些 在onStart 或者onResume,onPause 等生命周期中执行 很多方法,如:在界面打开时 我们需要在 onStart中开启定位,onDestroy 时销毁 定位对象,这些代码通常是写在 activity中的去管理,当应用的业务越来越复杂,可能 activity中的生命周期会写的东西越来越多,这个时候就有了救世主Lifecycle ,我们可以把activity 声明周期中的逻辑 交给 Lifecycle ,让Lifecycle 去处理。

使用Lifecycle的好处
  • 保证你的UI 能根据数据状态发生改变
  • 不会有内存泄漏
  • 不会因为Activity的stop造成crashes
  • 不用手动去控制生命周期
  • 永远保证数据更新

这段代码是 创建一个 Lifecycle 接口 其中实现了 Lifecycle对应 界面的声明周期

public interface IPresenter extends DefaultLifecycleObserver {

    @Override
    default void onPause(@NonNull LifecycleOwner owner) {

    }

    @Override
    default void onCreate(@NonNull LifecycleOwner owner) {

    }

    @Override
    default void onResume(@NonNull LifecycleOwner owner) {

    }

    @Override
    default void onDestroy(@NonNull LifecycleOwner owner) {

    }

    @Override
    default void onStart(@NonNull LifecycleOwner owner) {

    }

    @Override
    default void onStop(@NonNull LifecycleOwner owner) {

    }
}
接下来 我们再去写一个 base去实现 IPresenter 接口(这点因人而异,我做了多的一层封装,你也可以不写这个接口)
public class BasePresenter implements IPresenter {

    private static final String TAG = ".BasePresenter";

    @Override
    public void onCreate(LifecycleOwner owner) {

        Log.d("开始定位", this.getClass().toString());
    }

    @Override
    public void onResume(LifecycleOwner owner) {
        Log.d("绘制", this.getClass().toString());
    }

    @Override
    public void onDestroy(@NonNull LifecycleOwner owner) {
        Log.d("销毁定位对象", this.getClass().toString());
    }

    @Override
    public void onStart(@NonNull LifecycleOwner owner) {
        Log.d("恢复定位", this.getClass().toString());
    }

    @Override
    public void onPause(@NonNull LifecycleOwner owner) {
        Log.d("停止定位", this.getClass().toString());
    }

    @Override
    public void onStop(@NonNull LifecycleOwner owner) {
        Log.d("关闭定位", this.getClass().toString());
    }
}
然后在activity中进行绑定让 activity中的生命周期交给 我们刚刚写好的BasePresenter 去管理,我们只需要将BasePresenter 添加进Lifecycle 的观察中就可以了。这样 当 这个activity的状态发生改变的时候就会调用BasePresenter中的对应方法,是不是很神奇(其实我们自己写mvp模式的时候 也可以写出类似的操作,只是没有Lifecycle 简洁 实用,毕竟是谷歌官方的组件,跟着老大走没错)@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    getLifecycle().addObserver(new BasePresenter());
}

 如果需要,后续我会写liveData 和Viewmodel的使用

 

你可能感兴趣的:(adnroid,架构组件,Lifecycle)