Android Architecture Components(2) -LiveData

Android Architecture Components是google官方提供的一套架构组件,用于设计构建更加稳健,可测试和易维护的应用,在Android Architecture Components中包括如下几个组件:

  • LifeCycle:是一个用于定义Android组件生命周期的对象;
  • LifeCycleOwner:拥有生命周期的组件所实现的接口;
  • LifeCycleObserver:订阅组件生命周期变化的类所实现的接口;
  • ViewModal:旨在以一种具有生命周期的数据存储方式来管理界面相关的数据,在ViewModal中存储的数据在屏幕旋转过程中并不会发生改变;
  • LiveData:是一个可观察的数据持有者,当数据变化时通知观察者,同时也可以观察组件生命周期变化;
  • Room:数据库操作的框架;

LifeCycle简介

关于LifeCycle,官网的说明如下:

Defines an object that has an Android Lifecycle. Fragment and FragmentActivity classes implement LifecycleOwner interface which has the getLifecycle method to access the Lifecycle. You can also implement LifecycleOwner in your own classes.

由此可以看出LifeCycle是用来定义一个具有Android生命周期的类或者对象的接口,支持库中的Fragment和FragmentActivity实现了LifeCycleOwener接口并可以通过getLifeCycle方法获取LifeCycle对象,你也可以在你的类中自己实现LifeCycle接口。
ON_CREATE,ON_START,ON_RESUME事件会在LifeCycleOwner对应的事件结束后回调,ON_PAUSE_ON_STOP<ON_DESTROY会在LifeCycleOwner对应的函数执行之前回调(PS:一定要注意回调顺序,回调顺序能保证你确定LifeCycleOwner当前所处的状态)。

LifeCycleOwner简介

如下图所示

这里写图片描述

一般情况下,我们认为Activity/Fragment/Service等这些有严格生命周期函数的组件为LifeCycleOwner,而ViewModal,LiveData则可以做为观察者,订阅这些组件的生命周期变化,在生命周期变化时更新UI。

其中在源码中有些生命周期组件都已经实现了LifeCycleOwner接口,并不需要我们自己去实现,例如AppCompactActivity,下面是他的继承关系图:

这里写图片描述

具体在使用过程中,可查看源码,如果源码内没有实现LifeCycleOwner接口,就需要自己实现了。

自己实现LifeCycleOwner

上面讲到了,系统中的部分组件已经实现了LifeCycleOwner 接口,那对于系统没有实现的,我们应该怎么做呢?(这里以android.app.Fragment为例说明)。
在自己实现LifeCycleOwner过程中,需要LifecycleRegistry类打辅助:
LifeCycleRegistry的官网说明如下:

An implementation of Lifecycle that can handle multiple observers.
It is used by Fragments and Support Library Activities. You can also directly use it if you have a custom LifecycleOwner.

意思是说它是LifeCycle接口的一个实现,其可以处理多个观察者同时监听的情况,通常情况下,是被支持库中的Activity和Fragment使用的,当然当你需要自己实现一个LifeCycleOwner时,也可以直接使用它(引用英文并非为了装13,而是希望大家能够养成阅读官方文档的习惯。)

Ok,那么接下来让我们一起实现吧,一般有如下三步:

  • 实现LifeCycleOwner接口
  • 初始化LifeCycleRegistry对象并返回
  • 注入生命周期状态

实现LifeCycleOwner接口
首先新建一个类,继承自android.app.Fragment 并实现LifeCycleOwner接口
如下所示:

public class LifeCycleFragment extends Fragment implements LifecycleOwner {

  @NonNull
  @Override
  public Lifecycle getLifecycle() {
    return null;
  }
}

初始化LifeCycleRegistry对象并返回

public class LifeCycleFragment extends Fragment implements LifecycleOwner {

  private LifecycleRegistry mLifecycleRegistry;

  @Override
  public void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    mLifecycleRegistry = new LifecycleRegistry(this);
  }

  @NonNull
  @Override
  public Lifecycle getLifecycle() {
    return mLifecycleRegistry;
  }
}

注入生命周期状态

public class LifeCycleFragment extends Fragment implements LifecycleOwner {

  private LifecycleRegistry mLifecycleRegistry;
  
  public LifeCycleFragment(){
  }

  @Override
  public void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    mLifecycleRegistry = new LifecycleRegistry(this);
    mLifecycleRegistry.markState(State.CREATED);
  }

  @Override
  public void onStart() {
    super.onStart();
    mLifecycleRegistry.markState(State.STARTED);
  }

  @Override
  public void onResume() {
    super.onResume();
    mLifecycleRegistry.markState(State.RESUMED);
  }

  @Override
  public void onDestroy() {
    super.onDestroy();
    mLifecycleRegistry.markState(State.DESTROYED);
  }

  @NonNull
  @Override
  public Lifecycle getLifecycle() {
    return mLifecycleRegistry;
  }
}

LifeCycleObserver简介

上面说过LifeCycleObserver是监听组件生命周期变化的接口,关于它的官网说明如下:

Marks a class as a LifecycleObserver. It does not have any methods, instead, relies on {OnLifecycleEvent} annotated methods.

从上可以看出它是一个标记接口,只是用来标记这个类是一个监听生命周期变化的类,并不具有任何函数,而要真正监听生命周期变化,需要依赖于OnLifecycleEvent注解来实现。

编码实现LifeCycleObserver

编写一个LifeCycleObserver大概有两步:

1.根据Java版本实现LifeCycleObserver接口,添加OnLifecycleEvent注解回调
2.绑定Observer到LifeCycleOwner

根据Java版本实现LifeCycleObserver接口,添加OnLifecycleEvent注解回调
对于LifeCycleObserver而言,不同的Java版本实现不同,Java 8可用如下方式实现:

 class TestObserver implements DefaultLifecycleObserver {
     @Override
     public void onCreate(LifecycleOwner owner) {
         // your code
     }
 }

Java 8以下用注解方式实现

    class MyLifeCycleObserver implements LifecycleObserver{
        private  Context context;
        private  CallBack callBack;
        MyLifeCycleObserver(Context context,CallBack callBack){
            this.context = context;
            this.callBack = callBack;
        }

   @OnLifecycleEvent(Lifecycle.Event.ON_START)
        void start(){
            Log.e("LifeCycleObserverDemo","Activity started,do init things");
            callBack.start();
        }
        @OnLifecycleEvent(Lifecycle.Event.ON_STOP)
        void stop(){
            Log.e("LifeCycleObserverDemo","Activity stoped,do stop things");
            callBack.stop();
        }
    }

上述代码中CallBack为执行完Observer内部事件的回调,内容如下:

interface CallBack{
        void start();
        void stop();
    }

绑定Observer到LifeCycleOwner
使用如下方式绑定LifeCycleObserver到LifeCycleOwner

myLifeCycleObserver = new MyLifeCycleObserver(this, new CallBack() {
            @Override
            public void start() {
                Log.e("LifeCycleObserverDemo","Activity started,do init things end,update ui");
            }
@Override
            public void stop() {
                Log.e("LifeCycleObserverDemo","Activity stoped,do stop things end,update ui");
            }
        });
        getLifecycle().addObserver(myLifeCycleObserver);

在LifeCycleOwner Destory时记得解绑:

@Override
protected void onDestroy() {
    super.onDestroy();
    getLifecycle().removeObserver(myLifeCycleObserver);
}

根据上文编写Observer绑定到Owner的log输出如下:
[图片上传失败...(image-ad64a9-1512484508738)]


这里写图片描述

最新文章会更新在我的公众号上,欢迎大家关注
[图片上传失败...(image-abeded-1512484508738)]

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,015评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,262评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,727评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,986评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,363评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,610评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,871评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,582评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,297评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,551评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,053评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,385评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,035评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,079评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,841评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,648评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,550评论 2 270

推荐阅读更多精彩内容