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 {    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 {        @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 

更多相关文章

  1. android Java 笔试考题
  2. android中线程的应用
  3. Android高性能编码实战:网络框架优化
  4. android消息机制
  5. Android进程与线程基本知识
  6. 浅析Android单线程模型
  7. Android(安卓)多线程之几个基本问题
  8. Android异步处理三:Handler+Looper+MessageQueue深入详解
  9. Android(安卓)性能优化的一些方法

随机推荐

  1. html5基础 label 配合input,辅助输入
  2. 如何取HTML中的select中的值
  3. HTML+jQuery图片上传示例
  4. js字符串与html代码互相转换时怪想法:自
  5. 设计不是使用跨度和按钮
  6. Nodejs中利用phantom把html转为pdf或图片
  7. 图标旋转但返回上一个位置
  8. CSS定位属性之间的相互作用
  9. 动画滚动无法在Firefox中运行?
  10. HTML5 Canvas编写五彩连珠(3):设计