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
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
iOS APP提交上架最新流程(转)
时隔1年又让我鼓捣iOS,刚接手就是上架,经验值为0的我,虽然内心是拒绝的,但还是要接受这项任务滴!也就是在被拒后重新审核,再改在提交。。。这样 反复的过程中也对上架流程熟悉了好多,写篇帖子送给同为菜鸟的你,如果里面有很菜的东西,大牛请自动忽略,毕竟这也是还为菜鸟的我的备忘录呢! 一、证书的导出 1.1 前期工作 首先你需要有一个苹果的开发者帐号,一个Mac系统。 如果没有帐号可以在打开http://developer.apple.com/申请加入苹果的开发者计划。怎么申请网上有详细的介绍,因为我没有实际申请过,所以在此不多做介绍。 如果你已经有了一个IDP,打开https://developer.apple.com/并登录到苹果MemberCenter,登录以后可以看到下面这个界面,列出了你开发需 要的一些工具,支持,itunes app管理等内容。见下: 选择Certificates, Identifiers & Profiles(左边第二项),申请证书、App ID、设备等配置都在此处。见下: 以上是对应开发的不同版本对应的不...
- 下一篇
Android ImageView的scaleType属性与adjustViewBounds属性(转)
ImageView的scaleType的属性有好几种,分别是matrix(默认)、center、centerCrop、centerInside、fitCenter、fitEnd、fitStart、fitXY android:scaleType="center" 保持原图的大小,显示在ImageView的中心。当原图的size大于ImageView的size,超过部分裁剪处理。 android:scaleType="centerCrop" 以填满整个ImageView为目的,将原图的中心对准ImageView的中心,等比例放大原图,直到填满ImageView为止(指的是ImageView的宽和高都要填满),原图超过ImageView的部分作裁剪处理。 android:scaleType="centerInside" 以原图完全显示为目的,将图片的内容完整居中显示,通过按比例缩小原图的size宽(高)等于或小于ImageView的宽(高)。如果原图的size本身就小于ImageView的size,则原图的size不作任何处理,居中显示在ImageView。 android:sca...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- CentOS8编译安装MySQL8.0.19
- Red5直播服务器,属于Java语言的直播服务器
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- CentOS7设置SWAP分区,小内存服务器的救世主
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- Docker安装Oracle12C,快速搭建Oracle学习环境
- CentOS8安装Docker,最新的服务器搭配容器使用
- CentOS8安装MyCat,轻松搞定数据库的读写分离、垂直分库、水平分库