Android官方架构组件介绍之LifeCycle
来源:互联网 发布:understand mac 破解 编辑:程序博客网 时间:2024/05/21 14:43
0.前言
1.生命周期
在移动操作系统上开发软件其实是十分复杂的一件事情,因为我们随时需要面对系统和用户的各种不可预料的操作,很多时候,事情并不向着我们预设的方向方向进展。因此系统向我们提供了核心组件的生命周期这种东西,告知我们的APP正处在什么样的状况中,以便于我们做出相应的处理。可是随着业务的逐渐复杂,我们可能在添加监听之间需要向服务器验证某些用户信息,等返回信息正确才去监听定位。那么在网络异步回调的时候,我们就很难知道当前的activity的生命周期状态。
如果发生上图的情况,那么我们的占用的相关资源就可能永远无法移除了。这还只是冰山一角,大家尽可以想想,当我们的异步调用面对无法预知的用户操作和系统处理的时候,什么问题都可能发生。
总而言之,由于我们对于UI实时的状态做不到了如指掌,以至于对数据和逻辑的处理就无法尽善尽美。这是类似隐患得不到很好的解决根本原因。
2. Google大礼包
下面是官方提供的Android App开发的架构图:
从上图可以看到一些关键字:ViewModel
,LiveData
,Room
等。其实看了上面视频的会发现Google官方android架构组件一共包括以下几个:
- LifeCycle : 与Activity和Fragment的生命周期有关
- LiveData :异步可订阅数据,也是生命周期感知
- ViewModel :视图数据持有模型,也是生命周期感知
- Room :SQLite抽象层,用于简化SQLite数据存储
AS中添加依赖
首先在工程根目录的build.gradle
中添加一下内容:
allprojects { repositories { jcenter() maven { url 'https://maven.google.com' } //添加此行 }}
然后在应用目录下的build.gradle
中添加以下依赖:
//For Lifecycles, LiveData, and ViewModelcompile "android.arch.lifecycle:runtime:1.0.0-alpha1"compile "android.arch.lifecycle:extensions:1.0.0-alpha1"annotationProcessor "android.arch.lifecycle:compiler:1.0.0-alpha1"//For Roomcompile "android.arch.persistence.room:runtime:1.0.0-alpha1"annotationProcessor "android.arch.persistence.room:compiler:1.0.0-alpha1"
2.1 核心:Lifecycle Components
这套架构最核心的就是生命周期组件,:Lifecycle Components用于管理UI控制器(Activity/Freagment)的生命周期,方便查询当前组件生命周期的状态。
可查询的状态如下:
具体的使用方式有两种:
- 继承LifecycleActivity/LifecycleFragment即可
- 自己实现LifecycleRegistryOwner接口
java
// 通过继承,就已经将自己的生命周期的交给了Lifecycle Components管理了。public class MainActivity extends LifecycleActivity {}
那我们如何使用呢?
// 通过继承LifecycleObserver,保证我们可以通过注解或者接口查询UI的生命周期public class MyTest implements LifecycleObserver { private Lifecycle lifecycle; // Lifecycle包含了当前组件的生命周期 public MyTest(Lifecycle lifecycle){ lifecycle.addObserver(this); this.lifecycle=lifecycle; }// 当onResume发生的时候,该方法被调用 @OnLifecycleEvent(Lifecycle.Event.ON_RESUME) public void resume(){ Log.i("TAG","it called when resume "); } public void doTest(String s){ // 随时可以查询当前的UI状态 if(lifecycle.getCurrentState().equals(Lifecycle.State.RESUMED)){ Log.i("TAG","resume"); }else{ Log.i("TAG","is not resume !! "); } }}public class MainActivity extends LifecycleActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //将当前Activity的生命周期传递到MyTest中即可 MyTest myTest=new MyTest(this.getLifecycle()); }}
看到这里,你一定心头一喜,如果有这个组件,那么我们就完全有能力将Activity作为一个UI的控制器,仅仅用来显示UI和相应用户操作,把Activity的大小缩小至最小。不用着急,大礼包远不止这些。
3.ViewModel和LiveData
- ViewModel 是一个UI相关数据的暂存器,当所有相关的UI都finish掉的时候,它才会清除自己的数据。
- LiveData则是一个持有具体数据并且可被观察,能感知生命周期的组件(它就像RxJava中一个能遵循组件生命周期的Observable)
他俩的关系,就是,ViewModel负责管理着不同的LiveData,并把它提供给UI。
3.1 LiveData
我们可以先来说说LiveData。由于它已经能够感知生命周期,也就意味着我们并不需要在去查询当前UI的生命周期,由于可被观察,也就意味着当它持有的数据发生改变,观察者可以立即受到信息。livedata最重要的方法是一下几个:
onActive() // 当前LiveData有超过一个的活跃的观察者时,被调用onInactive() // 当前没有任何活跃的观察时,着被调用setValue() // 勇于改变当前数据,这样观察者可以受到改变后的数据。// 观察数据变化,并感知当前UI的生命周期observe(LifecycleOwner owner, Observer<T> observer)
这里有一个活跃的观察者的概念,我们不妨把它放在后面来看。LiveData的用法如下:
public class LocationLiveData extends LiveData<Location> { private LocationManager locationManager; private SimpleLocationListener listener = new SimpleLocationListener() { @Override public void onLocationChanged(Location location) { setValue(location); } }; public LocationLiveData(Context context) { locationManager = (LocationManager) context.getSystemService( Context.LOCATION_SERVICE); } @Override protected void onActive() { locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, listener); } @Override protected void onInactive() { locationManager.removeUpdates(listener); }}public class MainActivity extends LifecycleActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); LiveData<Location> myLocationListener = new LocationLiveData(); /* * observe(LifecycleOwner owner, Observer<T> observer) * 这个方法就是向LiveData中添加观察者, * LiveData则可以通过LifecycleOwner来判断 * 当前传入的观察者是否是活跃的(也就是UI是否可见了) */ myLocationListener.observe(this, new Observer<Location>() { @Override public void onChanged(@Nullable Location location) { // update //当LiveData中通过setValue()修改了数据时, //这里将会受到修改后的数据 } }); }}
好了,LiveData基本的用法讲完了,由于有了LiveData,我们的data更加“智能”了。当UI不可见的时候,改变的数据将不会被更新到UI上。
而且如果数据在不同的UI界面都会被用到的时候,我们还可以一个单例的LiveData,为不同的UI提供统一的数据。这些操作就不去细讲了。
现在回头看LiveData,我们发现它至少有以下几个优点:
- 可以避免内存泄露:由于 Observer 和 Lifecycle 绑定,当 Lifecycle 被销毁后,Observer 自动被清理。
- 避免在 Activity 被销毁后更新数据导致的崩溃情况
- 数据可共享
- 数据更新更智能:当数据在UI不可见的时候更新了,在恢复可见的时候,最新的数据会及时更新到UI上。
- 不需要在Activity中额外处理生命周期事件
一颗赛艇!
3.2 ViewModel
ViewModel则相对简单些,因为他的作用是暂存UI相关的数据,保证即使Activity配置更改,重新创建时,数据依然能够被保存好。
基本用法如下:
public class MyViewModel extends ViewModel { // MyViewModel用于管理不同的LiveData private MutableLiveData<List<User>> users; public LiveData<List<User>> getUsers() { if (users == null) { users = new MutableLiveData<List<Users>>(); loadUsers(); } return users; } private void loadUsers() { // do async operation to fetch users }}public class MyActivity extends AppCompatActivity { public void onCreate(Bundle savedInstanceState) { // 通过了ViewModelProviders来获取ViewModel // 用户获取和Activity绑定的ViewModel MyViewModel model = ViewModelProviders.of(this).get(MyViewModel.class); model.getUsers().observe(this, users -> { // update UI }); }}
这是ViewModel的最基本的用法,它负责从各个地方获取数据,然后把数据装到LiveData中,提供给UI;当然ViewModel也可以在不同的Fragment中共享,在这里就不多讲了。
由于ViewModel的本身和activity/fragment的生命周期绑定,当与之绑定的最后一个UI 销毁时,ViewModel才会clean自身的数据。
如图所示
4.数据持久化:Room
Room是Google提供的SQLite的ORM的解决方案,其实本质上和其他的ORM框架没什么特别大的差别,没有太多新意,因此只给出大体的架构图,有兴趣的同学可以自行去学习
5.总结
我们现在回头看整个架构
其实最有有趣的就是UI-ViewModel这个部分,这套架构至少可以帮助我们做到一下几点:
- UI与Data真正分离
- 异步调用和逻辑控制可以更加精细(因为对生命周期感知更多)
- 实现Model驱动UI
附录
android官网: https://developer.android.com/topic/libraries/architecture/index.html
原文链接:http://www.jianshu.com/p/7fa7679572cc
- Android官方架构组件介绍之LifeCycle
- Android官方架构组件介绍之LifeCycle
- Android架构组件学习之LifeCycle
- Google I/O Android官方新体系架构之:Lifecycle
- Google I/O Android官方新体系架构之:Lifecycle
- Google I/O 2017 Android官方新体系架构之:Lifecycle
- Android官方架构组件指南
- Android官方架构组件-ViewModel
- Android 架构组件(一)——Lifecycle
- Android四大组件之:Activity(官方介绍翻译)
- 谷歌官方推出Android应用开发架构组件介绍(Android Architecture Components)
- Lifecycle-aware Components google官方生命周期组件
- 改造 Android 官方架构组件 ViewModel
- android 之 Activity lifecycle
- android lifecycle之onpause
- 【Android四大组件之Service】(一)Android中Service(服务)的官方介绍
- android架构组件之Room
- Android架构组件之ViewModel
- arduino远程刷新(烧录)固件
- 字符串及字符串常量池
- Nginx rewirte规则详解-转于老僧系列Nginx
- nginx location的正则匹配规则
- MySQL数据库5.6版本首次安装Root密码问题
- Android官方架构组件介绍之LifeCycle
- ubuntu下使用rst2pdf转换成pdf中文文档及在ubuntu下安装新字体
- HDU 2099
- F. Madness Codeforces 822F 贪心 构造
- 单例设计模式
- CVPR2017论文分类汇总
- leetcode--Reverse Linked List II
- 圆括号
- 看到的redis简单例子,类似于抢票的非常简单例子