首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何构建Android MVVM 应用框架

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设计思想开发,理解本文会有比较大帮助

4.4K60

如何构建Android MVVM应用程序

一个Activity文件,一看一言难尽, Android中经常会出现数千行Activity代码,究其原因,Android中纯粹作为View各个XML视图功能太弱,Activity基本上都是View...在Android开发中MVP设计思想用得比较多,利用MVP设计模型可以把部分逻辑代码从Fragment和Activity业务逻辑移出来,在Presenter中持有ViewActivity或者...由 图 1 中ViewModel模块中我们可以看出ViewModel类下面一般包含下面5个部分: Context (上下文) Model (数据模型Bean) Data Field (数据绑定) Command...(命令绑定) Child ViewModel (子ViewModel) 我们先来看下示例代码,然后在一一讲解5个部分是干嘛用: //context private Activity context;...(ViewModel 不做UI相关事)或者说改变ActionBar上面的图标的颜色,改变ActionBar按钮是否可点击,这些都不是写在xml里面(都是用java 初始化话),如何这些控件属性做绑定

1.2K10
您找到你想要的搜索结果了吗?
是的
没有找到

MVVM遇到Databinding,京东工程师实现1+1>2

我们View和ViewModel通过DataBinding可以实现单向绑定或双向绑定,做到UI和数据相互监听。...其实在我们使用Databinding过程中可以发现,单纯使用Databinding使用有几个痛点: Databinding规则比较多,而且每个人其理解不同,用起来比较杂乱,导致代码阅读性差; 对于已经使用...以下是我们约定五点规则: ① 我们约定把Activity、Fragment绑定数据放在xxxViewModel中,楼层绑定数据放在楼层类(代码xxxFloor)中,列表item绑定数据放在ViewHolder...当然如果你按照以上步骤改造了自己APP,可能过程中还会遇到一个问题,就是ViewModel中上下文引用问题,当然如果能用应用级别的context当然最好,但是有时候我们必须用activitycontext...时可能就有些困难了,因为我们不推荐ViewModel持有context,这样做可能造成内存泄漏,这时候我们可以结合Android Architecture Components来实现context获取

1.3K20

“终于懂了“系列:Jetpack AAC完整解析(四)MVVM - Android架构探索!

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 Viewcontext引用

1.9K10

MVC、MVP、MVVM理解与使用

前言 对于MVC、MVP、MVVM,这都是Android开发一种架构,随着日积月累开发,很对人这几种模式是再熟悉不过了。...而在MVC中View会直接从Model中读取数据而不是通过 Controller MVP模式核心思想 把ActivityUI逻辑抽象成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是有很大帮助

60110

Android技术栈(四)Android Jetpack MVVM 完全实践

但由于Activity/Fragment功能过于强大并且实际上包含了部分View层功能,导致最后Activity/Fragment既承担了View责任,又承担了Controller责任.所以一般较复杂页面...,Activity/Fragment很容易堆积代码,最终导致Controller混杂了View层和业务逻辑(也就是你们所知道一个Activity三千行) 在MVC中View层与Model几乎几乎完全没有隔离...层引用和一个IView接口引用,但不应该直接或者间接引用Viewandroid.view.View子类,甚至是操作参数中也最好不要有android.view.View子类传进来,因为它应该只负责业务逻辑和数据处理并通过统一接口...Jetpack工具包提供框架支持: View包含布局,以及布局生命周期控制器(Activity/Fragment) DataBinding用来实现View层与ViewModel数据双向绑定(但实际上在...就像上面所介绍过一样,Android组件是有明确生命周期,如果在组件销毁后,RxJava仍有后台线程在运行且你Observer引用了你Activity,就会造成内存泄漏.

3.7K01

代码手把手教你使用MVVM

XML视图功能太弱,我们大量处理View逻辑只能写在Activity中,这样Activity就充当了View和Controller两个角色,直接导致Activity代码臃肿、混乱,导致阅读困难、重用困难和维护困难...写View代码View层不进行业务处理,也就是我们在Activity不写业务逻辑和业务数据相关代码。...同时DataBinding框架已经支持双向绑定,让我们可以通过双向绑定获取View层反馈给ViewModel层数据,并这些数据上进行操作。...包名.类名 name为type中实体类定义“名字”,供以下布局中使用 定义了data属性后,就相当于xml布局已和实体类绑定 在控件中引用实体类属性格式为: @{实体类.属性名} 在控件中引用实体类方法格式为...本文主要讲解了一些本人再开发过程中总结Android MVVM构建思想,更多是理论上各个模块如何分工、代码如何设计。

1.9K20

项目架构三问—腾讯真题

今天就来谈谈吧: 介绍一下你们项目的架构 MVP,MVVM,MVC 区别 说说你理解MVVM 介绍一下你们之前做项目的架构 这个问题大家就真实回答就好,重点是要说完后提出自己项目架构认同或不认同观点...其次,由于Presenter里持有了Activity对象,所以可能会导致内存泄漏或者view空指针,这也是需要注意地方。...MVP层中,Presenter还是会持有View引用,但是在MVVM中,View和Model进行双向绑定,从而使viewModel基本只需要处理业务逻辑,无需关系界面相关元素了。...解决了代码量太多,或者模式化代码太多问题。由于双向绑定,所以UI相关代码就少了很多,这也是代码量少关键。...解决了因为Activity停止而导致View空指针问题。

51410

是时候更新手里武器了—Jetpack架构组件简析

View层主要指UI相关,比如xml布局文件,Activity界面显示 ViewModel层是MVVM核心,连接view和model,需要将model数据展示到view上,以及view操作数据反映转化到...刚才我们介绍都是单向绑定,也就是布局中view绑定数据对象,那么如何让数据对象也view产生绑定呢?...这里要注意一个点是,双向绑定要考虑到死循环问题,当View被改变,数据对象对应发生更新,同时,这个更新又回通知View层去刷新UI,然后view被改变又会导致数据对象更新,无限循环下去了。...,前面说数据绑定时候就有一个可观察数据对象ObservableField。那两者有什么区别呢? 1)LiveData 具有生命周期感知能力,可以感知到Activity生命周期。...而且数据量一大就更加不方便了。 在Activity中,难免有些异步调用,所以就会容易导致界面销毁时候,这些调用还存在。那就会发生内存泄漏或者直接崩溃。

2.9K20

“终于懂了“系列:Jetpack AAC完整解析(五)DataBinding 重新认知!

所以,DataBinding 并非是 将 UI 逻辑搬到 XML 中写 导致而难以调试 ,只负责绑定数据, UI 控件 与 其需要 终态数据 进行绑定。...所以 DataBinding 本质就是 终态数据 与 UI控件 绑定,具有以下优势: 无需多处调用控件,原本调用地方只需要set数据即可 1延伸,无需手动判空 1延伸,完全不用写模板代码 findViewById...Adapter 每一项数据 分别进行设置,也就是说User是绑定到 Itemxml中: <?...这里 Jetpack AAC 及 MVVM ,做一些 补充 和 说明: 一、ViewModel 和 View 职责分离,ViewModel中处理业务逻辑,View 仅展示数据及传递事件 二、ViewModel...不引用 ViewContext 三、View 通过 LiveData 观察数据变化,不是直接向View 推送数据 四、ViewModel中 除了 业务 LiveData 外,还应该提供 LiveData

1.4K10

Android必看面试题——基础篇

2.内存泄漏 如果AsyncTask被声明为Activity非静态内部类,那么AsyncTask会保留一个Activity引用。...如果Activity已经被销毁,AsyncTask后台线程还在执行,它将继续在内存里保留这个引用导致Activity无法被回收,引起内存泄漏。...即使我们Android程序已经结束了,但是别的引用程序仍然还有我们Android程序某个对象引用泄漏内存依然不能被垃圾回收。...而MVVM就解决了这个问题,通过双向绑定机制,实现数据和UI内容,只要想改其中一方,另一方都能够及时更新一种设计理念,这样就省去了很多在View层中写很多case情况,只需要改变数据就行。...看起来MVVM很好解决了MVC和MVP不足,但是由于数据和视图双向绑定导致出现问题时不太好定位来源,有可能数据问题导致,也有可能业务逻辑中对视图属性修改导致

2.7K53

MVVM 进阶版:MVI 架构了解一下~

: [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通过

1.9K20

MVVM框架搭建(二)——项目搭建

引用类库时尽量使用项目依赖列表中项目,不要直接使用类库地址中项目 * * 需要添加新类库时,先查询本列表和项目中是否引用类似功能类库,尽量不要添加重复功能类库 */ project.ext...相比于MVP,MVVM没有多余回调,利用Databinding框架就可以将ViewModel中数据绑定到UI上,从而让开发者只需要更新ViewModel中数据,就可以改变UI。...绑定到相应UI上 ● ViewActivity、Fragment、layout.xml、Adapter、自定义View等等,负责将三者联系起来。...根据我们这个结构图 我们简单阐述一下 各个模块作用 Model层:负责提供数据源给ViewModel,包含实体类,网络请求和本地存储等功能 ViewModel层:将Model层提供数据根据View...层需要进行处理,通过DataBinding绑定到相应UI上 View层:Activity、Fragment、layout.xml、Adapter、自定义View等等,负责将三者联系起来 简单介绍了一下

1.3K20

Android面试题集

Android哪些情况会导致内存泄漏,如何分析内存泄漏? 常见产生内存泄漏情况如下所示: 持有静态ContextActivity引用。...不正确单例模式,比如单例持有Activity。 集合类内存泄漏,如果一个集合类是静态(缓存HashMap),只有添加方法,没有对应删除方法,会导致引用无法被释放,引发内存泄漏。...错误覆写了finalize()方法,finalize()方法执行执行不确定,可能会导致引用无法被释放。 查找内存泄漏可以使用Android Profiler工具或者利用LeakCanary工具。...后台进程 包含目前用户不可见 Activity 进程(已调用 Activity onStop() 方法)。...MVVM:使用ViewModel代替Presenter,实现数据View双向绑定,这套框架最早使用data-binding将数据绑定到xml里,这么做在大规模应用时候是不行,不过数据绑定是 一个很有用概念

80410

Android知识点基础篇(一)

所以可以通过Application来进行一些,数据传递,数据共享,数据缓存等操作。   在Application中如果保存对象有导致内存泄漏风险。...例如单例获取了context引用,传入activitycontext,在关闭activity时,由于单例还持有context引用导致activity内存无法被回收。...3、Handler持有Activity引用导致 4、MVP模式Presenter持有Activity引用导致 5、实例匿名内部类线程导致。...由最顶层ActivityViewGroup循环子View分发Down事件,如果子View包含ViewGroup,则循环ViewGroupView同样分发Down事件。...值得一提是,在源码中可以看到,ViewGroup是实实在在在做分发事件操作,而View处理只是自己是否处理接收到Down事件。

54240

Android DataBinding 从入门到进阶,看这一篇就够

前言 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 输入内容改变时

5.7K62

ViewModels and LiveData- Patterns + AntiPatterns

img 将视图(Activity或Fragment)引用传递给ViewModel是一个严重风险。让我们假设ViewModel从网络上请求数据,并且数据在一段时间后回来。...这时,View引用可能会被破坏,也可能是一个不再可见Activity,产生内存泄漏,并可能导致崩溃。 ❌ 避免在ViewModels中View进行引用。...当试图更新不存在视图时,不会发生空指针异常。 ViewModels不引用视图,所以内存泄漏风险较小。...视图如何区分正在加载数据、网络错误和一个空列表? 你可以从ViewModel中暴露出一个LiveData。例如,MyDataState可以包含关于数据是否正在加载、是否已经成功加载或失败信息。...如果repository持有ViewModel中回调引用,ViewModel将被暂时泄露。 img 如果ViewModel是轻量级,或者操作被保证快速完成,这种泄漏就不是什么大问题。

1.1K30

Android MVVM框架搭建(一)ViewModel + LiveData + DataBinding

ViewModel:关联层,将Model和View进行绑定,只做和业务逻辑相关工作,不涉及任何和UI相关操作,不持有控件引用,不更新UI。...二、ViewModel使用   ViewModel优势在于生命周期和数据持久化,那么它就适用于Activity和Fragment,其次就是异步回调,不会造成内存泄漏,再次就是View层和Model层进行隔离...因为这个结果是,那就是数据持久化,因为我们知道手机在切换屏幕时候Activity是会重新创建,因此如果我们数据是放在Activity中,那么切换屏幕之后就会重置,输入框也不会有值,但是通过ViewModel...pwd也是一样,然后在最后一处标注地方,MainViewModel中account和pwd进行数据观察,当这两个值有改变时通知页面最新值,这里用了lambda表达式进行了一次简化,实际代码是这样...我将会输入study、666,然后点击登录按钮,也会将输入框数据显示在TextView上,这样是否会省去很多不必要繁琐工作呢?

14K86

Android面试题含答案「建议收藏」

解决:将Handler声明为静态内部类,就不会持有外部类XXXActivity引用,其生命周期就和外部类无关, 如果Handler里面需要context的话,可以通过弱引用方式引用外部类 二、单例模式引起内存泄漏...解决:Context是ApplicationContext,由于ApplicationContext生命周期是和app一致,不会导致内存泄漏 三、非静态内部类创建静态实例引起内存泄漏。...控件组成页面充当View,实体数据库操作充当Model,而View和Model之间控件数据绑定操作则属于Presenter。...三、MVVM(Model-View-ViewModel) 如果说MVP是MVC进一步改进,那么MVVM则是思想完全变革。...,还可以对view进行注解,使用这个框架非常方便,但是缺点也是非常明显,使用这个项目,会导致项目这个框架依赖非常严重,一旦这个框架出现问题,那么项目来说影响非常大

1.3K20

Android MVVM框架搭建(一)ViewModel + LiveData + DataBinding

ViewModel:关联层,将Model和View进行绑定,只做和业务逻辑相关工作,不涉及任何和UI相关操作,不持有控件引用,不更新UI。...二、ViewModel使用   ViewModel优势在于生命周期和数据持久化,那么它就适用于Activity和Fragment,其次就是异步回调,不会造成内存泄漏,再次就是View层和Model层进行隔离...因为这个结果是,那就是数据持久化,因为我们知道手机在切换屏幕时候Activity是会重新创建,因此如果我们数据是放在Activity中,那么切换屏幕之后就会重置,输入框也不会有值,但是通过ViewModel...pwd也是一样,然后在最后一处标注地方,MainViewModel中account和pwd进行数据观察,当这两个值有改变时通知页面最新值,这里用了lambda表达式进行了一次简化,实际代码是这样...我将会输入study、666,然后点击登录按钮,也会将输入框数据显示在TextView上,这样是否会省去很多不必要繁琐工作呢?

2.2K32
领券