关闭

Android LiveData简介(一)

标签: android
1977人阅读 评论(0) 收藏 举报
分类:
Android LiveData简介(一)


使用Android的LiveData,需要在gradle添加引用:

    compile "android.arch.lifecycle:runtime:1.0.0"
    compile "android.arch.lifecycle:extensions:1.0.0"
    annotationProcessor "android.arch.lifecycle:compiler:1.0.0"

本文是基于三个引用的新版Version 1.0.0写的代码,我在使用其他版本比如Version 1.0.0alpha4,代码运行报错。如果遇到这种情况,请自行添加最新的版本引用。在1.0.0中,个别类和方法已经被Google Android官方废弃或者调整,比如LifecycleActivity已经过时,Android官方已经推荐开发者使用AppCompatActivity替换LifecycleActivity。一些关于Lifecycle的内容和技术,已经被Android官方写入AppCompatActivity,望周知。
LiveData实现基本的Android Activity/Fragment生命周期感知,本身其持有可观察数据,开发者可用LiveData的onActive/onInactive实现与Android生命周期解耦/耦合,进而通过LiveData的postValue或者setValue方法,通知观察者Observer数据的变化并请可观察的变化数据通过Observer的onChanged传导出来。

(一)使用LiveData,首先建立LiveData数据,一般继承自MutableLiveData。
MutableLiveData是LiveData的子类,添加了公共方法setValue和postValue,方便开发者直接使用。setValue必须在主线程调用。postValue可以在后台线程中调用。
本文写一个简单的MyData继承自MutableLiveData。MyData内部实现一个简单的功能,后台运行一个长时的线程任务,该线程实现一个简单功能:
(a)如果当前的Activity处于运行(用户可见)状态,则线程任务不断累计计数器并postValue一个值给任何Observer使用。
(b)如果当前Activity处于没有激活状态,则暂停线程任务,停止累计计数器。
(a)(b)两个功能由一个线程任务完成,具体实现可参见附录文章1。
在LiveData中,onActive方法回调表明当前Activity处于激活状态,也就是Activity处于生命周期的活动状态中(onStart,onResume),可以简单认为当前的Activity处于前台。
LiveData的onInactive处理涉及onActive剩下的生命周期,可以简单理解onInactive是Android的Activity/Fragment处于未激活(后台,比如当前Activity处于生命周期的onStop,onPause)。MyData.java:
package zhangphil.app;

import android.arch.lifecycle.MutableLiveData;
import android.util.Log;

public class MyData extends MutableLiveData<String> {
    private final String TAG = "LiveData";

    private int count = 0;
    private boolean RUN = true;

    private LongTimeWork mThread = new LongTimeWork();

    public MyData() {
        mThread.start();
    }

    @Override
    protected void onActive() {
        super.onActive();
        Log.d(TAG, "onActive");

        RUN = true;
        mThread.interrupt();
    }

    @Override
    protected void onInactive() {
        super.onInactive();
        Log.d(TAG, "onInactive");

        RUN = false;
    }

    private class LongTimeWork extends Thread {
        @Override
        public void run() {
            while (true) {
                try {
                    if (!RUN) {
                        Thread.sleep(Long.MAX_VALUE);
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }

                count++;
                postValue(String.valueOf(count));

                try {
                    Thread.sleep(3000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}


(二)构建Observer,在Observer的onChanged中等待变化数据传导过来。
在LiveData中的数据变化,通过postValue(可后台线程)或者setValue(主线程)设置后,将触发Observer的onChanged,开发者只需onChanged等待最新数据回调即可。
package zhangphil.app;

import android.arch.lifecycle.Observer;
import android.support.annotation.Nullable;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        MyObserver observer = new MyObserver();

        MyData data = new MyData();
        data.observe(this, observer);
    }

    private class MyObserver implements Observer<String> {
        @Override
        public void onChanged(@Nullable String o) {
            Toast.makeText(getApplicationContext(),String.valueOf(o),Toast.LENGTH_SHORT).show();
        }
    }
}

小结:Android的LiveData处理与Android生命周期相关的有生命周期属性的数据尤为便利。设想,一个任务,如果在Activity处于不可见比如用户按Home键不可见时候,此时可能不希望再做处理,那么就可以在LiveData的onInactive做一个逻辑处理,改变线程任务的状态,如果当前Activity又被用户调回前台,那么可以在LiveData的onActive重新恢复任务的运行。


附录:
1,《Android使用Thread的interrupt与sleep,重启或暂停线程任务》链接: http://blog.csdn.net/zhangphil/article/details/78584136 
2
1
查看评论

Android Architecture Component之LiveData

前言 看本片文章之前建议先看Android Architecture Component之Lifecycle-Aware Components源码分析,会用到里面的一些知识。本人水平有限,写的不好请谅解。 一、liveData是什么?1.介绍 * LiveData是一个数据持有者类,他持有一个...
  • a15286856575
  • a15286856575
  • 2017-11-14 16:30
  • 593

谷歌官方Android应用架构库——LiveData

谷歌官方Android应用架构库——LiveData
  • hubinqiang
  • hubinqiang
  • 2017-06-11 05:06
  • 7555

Android架构组件(二)——LiveData

Android架构组件(二)——LiveData 上一篇文章讲到了Android架构组件之一Lifecycle组件(Android 架构组件(一)——Lifecycle-Aware Components),现在我们再来看看另一个成员LiveData。 定义  简单地说,LiveData是...
  • sd_zhuzhipeng
  • sd_zhuzhipeng
  • 2017-12-22 11:35
  • 278

初探Architecture Components之LiveData

在初探Architecture Components之Lifecycle中,我们已经了解到Lifecycle是如何与组件的生命周期相关联的。在本文中,我们将会了解Architecture Components库如何管理数据,那就是LiveData?LiveData是一个持有数据的类,并将数据作为其值...
  • IO_Field
  • IO_Field
  • 2017-07-18 14:01
  • 2341

[译]Android架构组件 – 查看Room和LiveData – 第一部分

原文链接:https://riggaroo.co.za/android-architecture-components-looking-room-livedata-part-1/ 新的架构组件是什么? 架构组件的基本框架包括: Room - 一个SQLite对象映射器。非常类似于其他库,...
  • lihenair
  • lihenair
  • 2017-06-12 19:32
  • 4335

ObjectBox[七] 支持LiveData(Android体系结构组件)

ObjectBox[一] 特性ObjectBox[二] 教程:如何开始使用ObjectBoxObjectBox[三] 教程:安装和基础ObjectBox[四] 数据库持久化之实体注解ObjectBox[五]基本操作:查询ObjectBox[六]数据监听和RX(Data Observers and R...
  • Vxiaocai
  • Vxiaocai
  • 2017-11-30 20:41
  • 296

Architecture Components之LiveData的扩展

最近研究了一下Architecture Components,尝试用这个架构写了一个小demo,发现了一些问题,也有了一些心得,想分享给大家。
  • Hubert_bing
  • Hubert_bing
  • 2017-12-11 13:32
  • 200

Android架构组件之LiveData

基本概念LiveData是一个可以被观察的数据持有类,它可以感知并遵循Activity、Fragment或Service等组件的生命周期。正是由于LiveData对组件生命周期可感知特点,因此可以做到仅在组件处于生命周期的激活状态时才更新UI数据。LiveData需要一个观察者对象,一般是Obser...
  • u014738140
  • u014738140
  • 2017-11-29 18:14
  • 445

Android Architecture Components应用架构组件源码详解(基于1.0以上)(第二篇ViewModel和LiveData)

熟悉mvp模式的小伙伴应该都清楚,m->Model,v->View,p->presenter, p层调用model层的业务处理,将结果通过接口返回给View层,而此处所介绍的ViewModel用法有点类似与p层,只不过你要把业务处理放在这个ViewModel中,那么它就不那么像p层...
  • xiatiandefeiyu
  • xiatiandefeiyu
  • 2017-11-29 14:56
  • 589

android LiveData

LiveData是数据holder类,并支持数据可被监听(观察)。和传统的观察者模式中的被观察者不一样,LiveData是一个生命周期感知组件,因此观察者可以指定某一个LifeCycle给LiveData,并对数据进行监听。如果观察者的生命周期处于STARTED or RESUMED状态,LiveD...
  • lmjssjj
  • lmjssjj
  • 2017-05-24 11:10
  • 1683
    个人资料
    • 访问:1613249次
    • 积分:21023
    • 等级:
    • 排名:第450名
    • 原创:565篇
    • 转载:13篇
    • 译文:2篇
    • 评论:326条
    关于我
    邮箱: zhangphil@live.com
    博客专栏