# clubandroid **Repository Path**: yangzidong123/clubandroid ## Basic Information - **Project Name**: clubandroid - **Description**: 2332手动阀实打实大大 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-05-14 - **Last Updated**: 2025-05-16 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 一.mvc、mvp、mvvm、mvi区别:https://blog.csdn.net/qq_34178710/article/details/131256573?ops_request_misc=%257B%2522request%255Fid%2522%253A%25223e4ce2c1e72741db8a6c084b960fa46a%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=3e4ce2c1e72741db8a6c084b960fa46a&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~first_rank_ecpm_v1~rank_v31_ecpm-3-131256573-null-null.nonecase&utm_term=mvvm&spm=1018.2226.3001.4450 ## 1.mvc ### (1)角色 model:数据层 view:视图层 controller:控制层 ### (2)缺点:m和v没有解耦+activity臃肿 1.Controller和View层难以完全解耦,而且随着业务逻辑增多Controller会变的越来越臃肿。 2.在Android中Activity充当Controller和View的角色 3.M层和V层还有交互,没有做到完全分离。 ## 2.mvp ### (1)角色 model:数据层 view:视图层 presenter:逻辑控制层,通过【接口】连接M层和V层 ### (2)优点:m和v解耦 1.model和view真正解耦 2.可以进行单元测试,代码复用 ### (3)缺点:接口多+内存泄漏 1.大量使用接口回调将model层的数据回传给view层,业务增多,p层接口很多 2.如果一个P层用于多个Activity,所有Activity都要实现全部都接口,无论能不能用得到。修改P层接口,往往会涉及到很多个界面,很麻烦。 3.内存泄漏:p层会持有view层引用,页面销毁,p层不会销毁导致view无法被回收,导致内存泄漏(使用弱引用解决)。 4.不能感知生命周期,可能页面销毁,但是网络请求还在继续 ## 3.mvvm ### (1)角色 model:数据层 view:视图层 viewmodel:逻辑控制部分。作为桥梁,通知M层处理数据,并将结果回调到V层处理UI ### (2)优点:m和v解耦+不会内存泄漏 1.ViewModel不持有View的引用,view持有viewmodel的引用,不会产生内存泄漏 2.viewmodel通知model获得数据,将数据放在liveData或者Flow流,view订阅liveData和flow流更新UI,不需要使用接口回调技术 3.liveData和Flow感知生命周期,只有在页面活跃的时候才会订阅数据 4.大量使用jectpack组件,不需要写很多样板代码 ### (3)缺点: 1.DataBinding会产生大量的代码和属性字段,打包的时候apk体积变大 2.LiveData本身粘性,有数据倒灌问题 ## 4.mvi: ### view层发送Intent意图给viewmodel,viewmodel根据不同Intent通知model获得数据,更新State状态,view订阅State状态,更新UI ### (1)角色 model:数据层 view:视图层 viewmodel:逻辑控制部分 Intent:意图 State:状态 ### (2)优点: 1.单向数据流,很容易对状态变化进行跟踪和回溯 2.UI的所有变化来自State,所以只需聚焦State,架构更简单、易于调试 ### (3)缺点: 1.所有的操作最终都会转换成State,所以当复杂页面的State容易膨胀 2.State是不变的,每当State需要更新时都要创建新对象替代老对象,这会带来一定内存开销 # 二.Hilt依赖注入 ## 1.注入普通对象 ## 2.注入第三方 @Module @Provider ## 3.注入多个返回值类型一样 @Qualifier解决,不然编译错误