0.前言

为了帮助开发着打造一款优秀的APP,Google可谓费尽心力,推出了各种诸如MVP,MVVM等等项目架构的思路,帮助开发者更加高效的开发,尽管这样,Google还是接着推出了一个新的项目架构,以便给予开发者更多的选择,至于这种架构思路和MVP等框架的优劣,各位看完文章或许自有定论。

1.生命周期

在移动操作系统上开发软件其实是十分复杂的一件事情,因为我们随时需要面对系统和用户的各种不可预料的操作,很多时候,事情并不向着我们预设的方向方向进展。因此系统向我们提供了核心组件的生命周期这种东西,告知我们的APP正处在什么样的状况中,以便于我们做出相应的处理。


如上图。虽然Google给出了Activity非常详尽的生命周期结构,因此我们对根据生命周期做出相应的合理的安排,比如添加和移除实时GPS位置监听:


可是随着业务的逐渐复杂,我们可能在添加监听之间需要向服务器验证某些用户信息,等返回信息正确才去监听定位。那么在网络异步回调的时候,我们就很难知道当前的activity的生命周期状态。


如果发生上图的情况,那么我们的占用的相关资源就可能永远无法移除了。这还只是冰山一角,大家尽可以想想,当我们的异步调用面对无法预知的用户操作和系统处理的时候,什么问题都可能发生。

总而言之,由于我们对于UI实时的状态做不到了如指掌,以至于对数据和逻辑的处理就无法尽善尽美。这是类似隐患得不到很好的解决根本原因。

2. Google大礼包

这次Google推出了一套新的项目架构组件和架构思路,从UI到Data,帮助我们更加精准的开发自己的APP。

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 {@Overrideprotected 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 observer)

这里有一个活跃的观察者的概念,我们不妨把它放在后面来看。LiveData的用法如下:

public class LocationLiveData extends LiveData {private LocationManager locationManager;private SimpleLocationListener listener = new SimpleLocationListener() {@Overridepublic void onLocationChanged(Location location) {setValue(location);}};public LocationLiveData(Context context) {locationManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);}@Overrideprotected void onActive() {locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, listener);}@Overrideprotected void onInactive() {locationManager.removeUpdates(listener);}
}public class MainActivity extends LifecycleActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);LiveData myLocationListener = new LocationLiveData();/** observe(LifecycleOwner owner, Observer observer)* 这个方法就是向LiveData中添加观察者,* LiveData则可以通过LifecycleOwner来判断* 当前传入的观察者是否是活跃的(也就是UI是否可见了)*/myLocationListener.observe(this, new Observer() {@Overridepublic 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用于管理不同的LiveDataprivate MutableLiveData> users;public LiveData> getUsers() {if (users == null) {users = new MutableLiveData>();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绑定的ViewModelMyViewModel 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

6.勘误

暂无

附录

android官网: developer.android.com/topic/libra…


From:

https://juejin.im/post/59526e18f265da6c3d6c0ac9

Android 项目最新架构相关推荐

  1. android最新面试题及答案,Android项目开发如何设计整体架构

    首先,讲讲为什么我们要讲JAVA的语言进阶,从整体来讲,Java和Android的区别在于Android程序是基于组件和配置的,而且Android开发以Java语言为开发工具,表面上看他们有点同宗不同 ...

  2. Android项目架构设计深入浅出

    简介:本文结合个人在架构设计上的思考和理解,介绍如何从0到1设计一个大型Android项目架构. 作者 | 璞珂 来源 | 阿里技术公众号 前言:本文结合个人在架构设计上的思考和理解,介绍如何从0到1 ...

  3. 大型Android项目架构:基于组件化+模块化+Kotlin+协程+Flow+Retrofit+Jetpack+MVVM架构实现WanAndroid客户端

    前言:苟有恒,何必三更眠五更起:最无益,莫过一日曝十日寒. 前言 之前一直想写个 WanAndroid 项目来巩固自己对 Kotlin+Jetpack+协程 等知识的学习,但是一直没有时间.这里重新行 ...

  4. Android 项目架构设计深入浅出

    前言:本文结合个人在架构设计上的思考和理解,介绍如何从0到1设计一个大型Android项目架构. 一 引导 本文篇幅较长,可结合下表引导快速了解全文主脉络. 二 项目架构演进 该章节主要对一个Andr ...

  5. Android 金融类项目模块化架构

    一.前言 在以往的开发中,我们通常会使用MVC的模式进行开发,这样导致了Activity处理的逻辑非常的复杂,而且耦合度非常高,代码结构混乱.层次不清,各业务技术方案不统一,冗余代码充斥项目的各个角落 ...

  6. Android项目实战(三十八):2017最新 将AndroidLibrary提交到JCenter仓库(图文教程)...

    Android项目实战(三十八):2017最新 将AndroidLibrary提交到JCenter仓库(图文教程) 原文:Android项目实战(三十八):2017最新 将AndroidLibrary ...

  7. Android 应用开发(1)---Android项目架构搭建

    Android项目架构搭建 1. 前言 安卓属于小团队开发,架构的重要性在很多公司其实不是那么的明显,加上现在的开源框架层出不穷,更好的帮助我们上手android项目的开发.我前两年也在公司主导过项目 ...

  8. 【理论】【转】Android项目重构之路:架构篇

    为什么80%的码农都做不了架构师?>>>    去年10月底换到了新公司,做移动研发组的负责人,刚开始接手android项目时,发现该项目真的是一团糟.首先是其架构,是按功能模块进行 ...

  9. (最新react-native-0.59.5) 如何将ReactNative项目集成到现有得Android项目中(两种实现方法之一)

    背景:最近在学习React-Native相关的知识,有个需求,如果已经存在一个成熟的Android 或者 IOS项目,如何实现在后续的开发中用RN来实现部分功能.再此我只是讲解一下Android de ...

最新文章

  1. 【C 语言】数组 ( 数组取值操作 | array[i][j] 用法 等价于 *( *(array = i) + j ) 用法 | 下标操作到指针操作演化过程 )
  2. Ubuntu 16.04下用Wine运行的软件出现方块的解决思路(应该是兼容现在所有平台的Wine碰到这个的问题)...
  3. vue使用element日期选择器,选择日期少一天的问题
  4. 对现有的所能找到的DDOS代码(攻击模块)做出一次分析----CC篇
  5. cx_Oracle怎么打包,cx_Oracle 在执行包文件 function 时有多个出参该如何获取
  6. Spring源码分析-从源码看BeanFactory和FactoryBean的区别
  7. python爬虫天气实例scrapy_2017.08.04 Python网络爬虫之Scrapy爬虫实战二 天气预报...
  8. Java关键字new和newInstance的区别
  9. Javascript插入排序
  10. atitit 高并发之道 attilax著.docx 1. 概念 2 2. 并发一般涉及如下几个方面: 4 2.1. 多线程编程(已过时,不介绍) 4 2.2. 异步编程 4 2.3. 并行编程
  11. Python绘图常用的库及介绍
  12. python订单详细教程-python实现京东订单推送到测试环境,提供便利操作示例
  13. P1713 麦当劳叔叔的难题(90分)
  14. EMC/EMI 测试顺利通过
  15. 服务器里怎么找到K3账套文件,金蝶K3账套自动备份步骤详解
  16. echarts标题(title)设置背景图片
  17. (C语言)对称数判断
  18. CA双向认证完整实现步骤(附java客户端代码)
  19. android系统 通知,Android中通知的使用-----Notification详解
  20. 宝峰对讲机16频率表_宝峰uv5r系列对讲机出厂预置频率表-手工编辑版

热门文章

  1. asp.net mvc linux,ASP.NET MVC4开发指南PDF扫描版+源码
  2. html 延长直线,利用HTML5实现绘制3D线条延伸动画特效
  3. 微信用户关注内容调查
  4. 硕士小哥将iphoneX充电口改成Type-C,成品在eBay上拍卖,出价已超过56万元
  5. 移动端适配方案(rem和vw vh适配)(css预处理器-less)
  6. CF 159 div2 d
  7. BEPS生态过程模型简介和使用
  8. vivox20Android版本8.0,四月份可升级!vivo官方公布7款机型升级安卓8.0适配计划
  9. lenovo thinkpad t460s升级bios版本,造成opensuse linux 引导丢失修复...
  10. 05-20210222在WIN10下通过串口给华为海思Hi3518EV300刷机(鸿蒙系统)