View和Controller两个角色,直接导致Activity中的代码大爆炸。...MVP是以UI为驱动的模型,更新UI都需要保证能获取到控件的引用,同时更新UI的时候要考虑当前是否是UI线程,也要考虑Activity的生命周期(是否已经销毁等)。...复杂的业务同时也可能会导致P层太大,代码臃肿的问题依然不能解决。 MVVM View: 对应于Activity和XML,负责View的绘制以及与用户交互。 Model: 实体模型。...View View层做的就是和UI相关的工作,我们只在XML、Activity和Fragment写View层的代码,View层不做和业务相关的事,也就是我们在Activity不写业务逻辑和业务数据相关的代码...代码包含了一大部分MVVM Light Toolkit的使用场景(Data、Command、Messenger均有涉及),同时sample严格按照本博文阐述的MVVM设计思想开发,对理解本文会有比较大的帮助
的一个Activity文件,一看一言难尽, Android中经常会出现数千行的Activity代码,究其原因,Android中纯粹作为View的各个XML视图功能太弱,Activity基本上都是View...在Android开发中MVP的设计思想用得比较多,利用MVP的设计模型可以把部分的逻辑的代码从Fragment和Activity业务的逻辑移出来,在Presenter中持有View(Activity或者...由 图 1 中ViewModel的模块中我们可以看出ViewModel类下面一般包含下面5个部分: Context (上下文) Model (数据模型Bean) Data Field (数据绑定) Command...(命令绑定) Child ViewModel (子ViewModel) 我们先来看下示例代码,然后在一一讲解5个部分是干嘛用的: //context private Activity context;...(ViewModel 不做UI相关的事)或者说改变ActionBar上面的图标的颜色,改变ActionBar按钮是否可点击,这些都不是写在xml里面(都是用java 初始化话),如何对这些控件的属性做绑定呢
我们的View和ViewModel通过DataBinding可以实现单向绑定或双向绑定,做到UI和数据的相互监听。...其实在我们使用Databinding的过程中可以发现,单纯的使用Databinding使用有几个痛点: Databinding规则比较多,而且每个人对其理解不同,用起来比较杂乱,导致代码阅读性差; 对于已经使用...以下是我们约定的五点规则: ① 我们约定把Activity、Fragment绑定的数据放在xxxViewModel中,楼层绑定的数据放在楼层类(代码中的xxxFloor)中,列表item绑定的数据放在ViewHolder...当然如果你按照以上步骤改造了自己的APP,可能过程中还会遇到一个问题,就是ViewModel中上下文引用的问题,当然如果能用应用级别的context当然最好,但是有时候我们必须用activity的context...时可能就有些困难了,因为我们不推荐ViewModel持有context,这样做可能造成内存泄漏,这时候我们可以结合Android Architecture Components来实现context的获取
MVC 所以,MVC 的问题点 如下: Activity/Fragment 责任不明,同时负责View、Controller,就会导致其中代码量大,不满足单一职责。...Model层:Repository仓库,包含 本地持久性数据 和 服务端数据 View层 包含了我们平时写的Activity/Fragment/布局文件等与界面相关的东西。...鉴于 ViewModel 对象应该比它们更新的相应 View 对象存在的时间更长,因此 ViewModel 实现中不得包含对 View 对象的直接引用,包括Context。...ViewModel 不能持有 View层引用,包括Context也不能持有。 将一个数据源指定为单一可信来源。每当需要访问数据时,都应一律源于此单一可信来源。...3.4 MVP改造MVVM 了解了Jetpack MVVM的实现,再来改造 MVP 是很简单的了。 步骤如下: 去除Presener 对View、context的引用。
前言 对于MVC、MVP、MVVM,这都是Android开发的一种架构,随着日积月累的开发,很对人对这几种模式是再熟悉不过了。...而在MVC中View会直接从Model中读取数据而不是通过 Controller MVP模式的核心思想 把Activity中的UI逻辑抽象成View接口,把业务逻辑抽象成Presenter接口,Model...业务逻辑在Presenter中,避免后台线程引用Activity导致内存泄漏 ---- MVVM MVVM模式包含三个部分 Model代表基本的业务逻辑 View显示内容 ViewModel将前面两者联系在一起...MVVM模式中,一个ViewModel和一个View匹配,它没有MVP中的IView接口,而是完全的和View绑定,所有View中的修改变化,都会自动更新到ViewModel中,同时ViewModel...其实在我看来,学习MVVM就是在学习Data Binding Library,如果想学号MVVM可以去看看官方文档或是译文,学习好了Data Binding Library对学习MVVM是有很大的帮助的
但由于Activity/Fragment的功能过于强大并且实际上包含了部分View层功能,导致最后Activity/Fragment既承担了View的责任,又承担了Controller的责任.所以一般较复杂的页面...,Activity/Fragment很容易堆积代码,最终导致Controller混杂了View层和业务逻辑(也就是你们所知道的一个Activity三千行) 在MVC中View层与Model几乎几乎完全没有隔离...层的引用和一个IView接口的引用,但不应该直接或者间接引用View层android.view.View的子类,甚至是操作的参数中也最好不要有android.view.View的子类传进来,因为它应该只负责业务逻辑和数据的处理并通过统一的接口...的Jetpack工具包提供框架支持: View层包含布局,以及布局生命周期控制器(Activity/Fragment) DataBinding用来实现View层与ViewModel数据的双向绑定(但实际上在...就像上面所介绍过的一样,Android的组件是有明确的生命周期的,如果在组件销毁后,RxJava仍有后台线程在运行且你的Observer引用了你的Activity,就会造成内存泄漏.
XML视图功能太弱,我们大量处理View的逻辑只能写在Activity中,这样Activity就充当了View和Controller两个角色,直接导致Activity中的代码臃肿、混乱,导致阅读困难、重用困难和维护困难...写View层的代码,View层不进行业务处理,也就是我们在Activity不写业务逻辑和业务数据相关的代码。...同时DataBinding框架已经支持双向绑定,让我们可以通过双向绑定获取View层反馈给ViewModel层的数据,并对这些数据上进行操作。...包名.类名 name为type中的实体类定义“名字”,供以下布局中使用 定义了data属性后,就相当于xml布局已和实体类绑定 在控件中引用实体类属性的格式为: @{实体类.属性名} 在控件中引用实体类方法的格式为...本文主要讲解了一些本人再开发过程中总结的Android MVVM构建思想,更多是理论上各个模块如何分工、代码如何设计。
今天就来谈谈吧: 介绍一下你们项目的架构 MVP,MVVM,MVC 区别 说说你理解的MVVM 介绍一下你们之前做的项目的架构 这个问题大家就真实回答就好,重点是要说完后提出对自己项目架构的认同或不认同的观点...其次,由于Presenter里持有了Activity对象,所以可能会导致内存泄漏或者view空指针,这也是需要注意的地方。...MVP层中,Presenter还是会持有View的引用,但是在MVVM中,View和Model进行双向绑定,从而使viewModel基本只需要处理业务逻辑,无需关系界面相关的元素了。...解决了代码量太多,或者模式化代码太多的问题。由于双向绑定,所以UI相关的代码就少了很多,这也是代码量少的关键。...解决了因为Activity停止而导致的View空指针问题。
View层主要指UI相关,比如xml布局文件,Activity界面显示 ViewModel层是MVVM的核心,连接view和model,需要将model的数据展示到view上,以及view上的操作数据反映转化到...刚才我们介绍的都是单向绑定,也就是布局中view绑定了数据对象,那么如何让数据对象也对view产生绑定呢?...这里要注意的一个点是,双向绑定要考虑到死循环问题,当View被改变,数据对象对应发生更新,同时,这个更新又回通知View层去刷新UI,然后view被改变又会导致数据对象更新,无限循环下去了。...对,前面说数据绑定的时候就有一个可观察的数据对象ObservableField。那两者有什么区别呢? 1)LiveData 具有生命周期感知能力,可以感知到Activity等的生命周期。...而且数据量一大就更加不方便了。 在Activity中,难免有些异步调用,所以就会容易导致界面销毁时候,这些调用还存在。那就会发生内存泄漏或者直接崩溃。
所以,DataBinding 并非是 将 UI 逻辑搬到 XML 中写 导致而难以调试 ,只负责绑定数据, UI 控件 与 其需要的 终态数据 进行绑定。...所以 DataBinding 的本质就是 终态数据 与 UI控件 的绑定,具有以下优势: 无需多处调用控件,原本调用的地方只需要set数据即可 1的延伸,无需手动判空 1的延伸,完全不用写模板代码 findViewById...Adapter 对每一项数据 分别进行设置的,也就是说User是绑定到 Item的xml中: <?...这里对 Jetpack AAC 及 MVVM ,做一些 补充 和 说明: 一、ViewModel 和 View 职责分离,ViewModel中处理业务逻辑,View 仅展示数据及传递事件 二、ViewModel...不引用 View 及 Context 三、View 通过 LiveData 观察数据变化,不是直接向View 推送数据 四、ViewModel中 除了 业务 LiveData 外,还应该提供 LiveData
2.内存泄漏 如果AsyncTask被声明为Activity的非静态内部类,那么AsyncTask会保留一个对Activity的引用。...如果Activity已经被销毁,AsyncTask的后台线程还在执行,它将继续在内存里保留这个引用,导致Activity无法被回收,引起内存泄漏。...即使我们的Android程序已经结束了,但是别的引用程序仍然还有对我们的Android程序的某个对象的引用,泄漏的内存依然不能被垃圾回收。...而MVVM就解决了这个问题,通过双向绑定的机制,实现数据和UI内容,只要想改其中一方,另一方都能够及时更新的一种设计理念,这样就省去了很多在View层中写很多case的情况,只需要改变数据就行。...看起来MVVM很好的解决了MVC和MVP的不足,但是由于数据和视图的双向绑定,导致出现问题时不太好定位来源,有可能数据问题导致,也有可能业务逻辑中对视图属性的修改导致。
: [1240] MVC架构主要分为以下几部分 视图层(View):对应于xml布局文件和java代码动态view部分 控制层(Controller):主要负责业务逻辑,在android中由Activity...所以在android中mvc更像是这种形式: [1240] 因此MVC架构在android平台上的主要存在以下问题: Activity同时负责View与Controller层的工作,违背了单一职责原则...,这其实是单一数据源而不是双向数据绑定,所以其实MVVM的这一大特性我其实并没有用到 View通过调用ViewModel提供的方法来与ViewMdoel交互 小结 MVC架构的主要问题在于Activity...MVVM的双向数据绑定主要通过DataBinding实现,但有很多人(比如我)不喜欢用DataBinding,而是View通过LiveData等观察ViewModle的数据变化并自我更新,这其实是单一数据源而不是双向数据绑定...,其实并没有使用MVVM双向绑定的特性,而是单一数据源 当页面复杂时,需要定义很多State,并且需要定义可变与不可变两种,状态会以双倍的速度膨胀,模板代码较多且容易遗忘 View与ViewModel通过
中引用类库时尽量使用项目依赖列表中的项目,不要直接使用类库地址中的项目 * * 需要添加新的类库时,先查询本列表和项目中是否已引用类似功能的类库,尽量不要添加重复功能的类库 */ project.ext...相比于MVP,MVVM没有多余的回调,利用Databinding框架就可以将ViewModel中的数据绑定到UI上,从而让开发者只需要更新ViewModel中的数据,就可以改变UI。...绑定到相应的UI上 ● View:Activity、Fragment、layout.xml、Adapter、自定义View等等,负责将三者联系起来。...根据我们的这个结构图 我们简单阐述一下 各个模块的作用 Model层:负责提供数据源给ViewModel,包含实体类,网络请求和本地存储等功能 ViewModel层:将Model层提供的数据根据View...层的需要进行处理,通过DataBinding绑定到相应的UI上 View层:Activity、Fragment、layout.xml、Adapter、自定义View等等,负责将三者联系起来 简单的介绍了一下
Android哪些情况会导致内存泄漏,如何分析内存泄漏? 常见的产生内存泄漏的情况如下所示: 持有静态的Context(Activity)引用。...不正确的单例模式,比如单例持有Activity。 集合类内存泄漏,如果一个集合类是静态的(缓存HashMap),只有添加方法,没有对应的删除方法,会导致引用无法被释放,引发内存泄漏。...错误的覆写了finalize()方法,finalize()方法执行执行不确定,可能会导致引用无法被释放。 查找内存泄漏可以使用Android Profiler工具或者利用LeakCanary工具。...后台进程 包含目前对用户不可见的 Activity 的进程(已调用 Activity 的 onStop() 方法)。...MVVM:使用ViewModel代替Presenter,实现数据与View的双向绑定,这套框架最早使用的data-binding将数据绑定到xml里,这么做在大规模应用的时候是不行的,不过数据绑定是 一个很有用的概念
所以可以通过Application来进行一些,数据传递,数据共享,数据缓存等操作。 在Application中如果保存对象有导致内存泄漏的风险。...例如单例获取了context的引用,传入的是activity的context,在关闭activity时,由于单例还持有context的引用导致activity的内存无法被回收。...3、Handler持有Activity引用导致 4、MVP模式的Presenter持有Activity的引用导致 5、实例匿名内部类线程导致。...由最顶层Activity的ViewGroup循环子View分发Down事件,如果子View中包含ViewGroup,则循环ViewGroup的子View同样分发Down事件。...值得一提的是,在源码中可以看到,ViewGroup是实实在在在做分发事件操作,而View处理的只是自己是否处理接收到的Down事件。
前言 DataBinding 是谷歌官方发布的一个框架,顾名思义即为数据绑定,是 MVVM 模式在 Android 上的一种实现,用于降低布局和逻辑的耦合性,使代码逻辑更加清晰。...DataBinding 能够省去我们一直以来的 findViewById() 步骤,大量减少 Activity 内的代码,数据能够单向或双向绑定到 layout 文件中,有助于防止内存泄漏,而且能自动进行空检测以避免空指针异常...启用 DataBinding 的方法是在对应 Model 的 build.gradle 文件里加入以下代码,同步后就能引入对 DataBinding 的支持 android { dataBinding...layout 标签将原布局包裹了起来,data 标签用于声明要用到的变量以及变量类型,要实现 MVVM 的 ViewModel 就需要把数据(Model)与 UI(View)进行绑定,data 标签的作用就像一个桥梁搭建了...~tplv-k3u1fbpfcp-watermark.image] 三、双向数据绑定 双向绑定的意思即为当数据改变时同时使视图刷新,而视图改变时也可以同时改变数据 看以下例子,当 EditText 的输入内容改变时
img 将视图(Activity或Fragment)的引用传递给ViewModel是一个严重的风险。让我们假设ViewModel从网络上请求数据,并且数据在一段时间后回来。...这时,View的引用可能会被破坏,也可能是一个不再可见的旧Activity,产生内存泄漏,并可能导致崩溃。 ❌ 避免在ViewModels中对View进行引用。...当试图更新不存在的视图时,不会发生空指针异常。 ViewModels不引用视图,所以内存泄漏的风险较小。...视图如何区分正在加载的数据、网络错误和一个空列表? 你可以从ViewModel中暴露出一个LiveData。例如,MyDataState可以包含关于数据是否正在加载、是否已经成功加载或失败的信息。...如果repository持有对ViewModel中回调的引用,ViewModel将被暂时泄露。 img 如果ViewModel是轻量级的,或者操作被保证快速完成,这种泄漏就不是什么大问题。
ViewModel:关联层,将Model和View进行绑定,只做和业务逻辑相关的工作,不涉及任何和UI相关的操作,不持有控件引用,不更新UI。...二、ViewModel使用 ViewModel的优势在于生命周期和数据持久化,那么它就适用于Activity和Fragment,其次就是异步回调,不会造成内存泄漏,再次就是对View层和Model层进行隔离...因为这个结果是对的,那就是数据持久化,因为我们知道手机在切换屏幕的时候Activity是会重新创建的,因此如果我们的数据是放在Activity中,那么切换屏幕之后就会重置,输入框也不会有值,但是通过ViewModel...pwd也是一样的,然后在最后一处标注的地方,对MainViewModel中的account和pwd进行数据观察,当这两个值有改变时通知页面最新的值,这里用了lambda表达式进行了一次简化,实际的代码是这样的...我将会输入study、666,然后点击登录按钮,也会将输入框的数据显示在TextView上,这样是否会省去很多不必要的繁琐工作呢?
解决:将Handler声明为静态内部类,就不会持有外部类XXXActivity的引用,其生命周期就和外部类无关, 如果Handler里面需要context的话,可以通过弱引用方式引用外部类 二、单例模式引起的内存泄漏...解决:Context是ApplicationContext,由于ApplicationContext的生命周期是和app一致的,不会导致内存泄漏 三、非静态内部类创建静态实例引起的内存泄漏。...控件组成的页面充当View,实体数据库操作充当Model,而View和Model之间的控件数据绑定操作则属于Presenter。...三、MVVM(Model-View-ViewModel) 如果说MVP是对MVC的进一步改进,那么MVVM则是思想的完全变革。...,还可以对view进行注解,使用这个框架非常方便,但是缺点也是非常明显的,使用这个项目,会导致项目对这个框架依赖非常的严重,一旦这个框架出现问题,那么对项目来说影响非常大的。
领取专属 10元无门槛券
手把手带您无忧上云