Android 中常用的框架就是MVC MVP MVVM , 使用框架的目的是让 视图层 和 数据处理层达到解耦的目的,从而能够更好的 理解、扩展原有的代码。
一 当然我们也可以使用一个文件打天下的方式来开发应用,所有的逻辑都放在Activity,一个文件打天下再某些变动频率极少的情况下可以使用,优点是编译运行效率比较高。当然这一个类 可以定义内部类,枚举类。毕竟java开发是面向对象的思想的,封装 还是有必要做的。
典型的例子是 Android 源码里面 View 有近3万行代码,定义了好多 接口,内部类,方便阅读代码
二 MVC 模式是让 View 层 和 Model 层解耦,也就是 界面的刷新 和 数据和业务逻辑的处理(获取,更新等)分离。
1 纯粹的View 层 xml 布局。 VC 层 集中在一个类里面 ,比如 Fragment,Activity 和自定义的View。Model 包含 Entity 和 数据获取的类。
2 实现的方式 VC 层 持有 Model 的引用,如果model 的业务逻辑是同步返回值 或者不需要model 处理的返回值,比较好处理。 如果view 需要model 业务处理 是异步的返回值,则需要通过接口回调的方式,来获取数据,则model 会直接或者间接持有 View的引用,为了避免Activity 的内存泄漏,需要注意 在 生命周期 onDestroy 里面,把 model 持有的View 引用置空,从而防止内存泄漏。
3 MVC 模式 在一定程度上达到了 解耦的目的,但是随着业务逻辑的增多,VC层由于负责的东西越来越多,导致VC 层代码量会比较大,不利于维护。
三 MVP 模式 是MVC 基础上 为了解决 VC耦合在一块的问题, P层相当于 达到 VC分离的目的
1 Presenter 主持人的意思, 也就是 起到 一些桥梁沟通的作用,也可以理解为控制层。 P层 完全 实现了 View 和 Model 的完全解耦,扩展性更强, 一个present 可以被不同的View调用来 实现自己的业务逻辑, 一个present 也可以使用不同的model 来 实现系统的数据处理。 例如: 为了方便测试,我们调试界面的可以专门写一个加载本地缓存的服务器的数据的model,来避免 服务器不稳定影响开发效率。 为了调试某一个接口数据,我们可以 启动一个测试的Activity ,来 加载一个需要调试的接口,从而避免 外部代码的干扰,日志打印也更加清晰。
2 实现方式 : 盗用下 www.jianshu.com/p/824e59f34… 的图 ,也是google 推荐的写法
MainContract 作为契约类,主要有两类接口,第一、封装了 Presenter 持有 View 层的接口,方便View层更新界面, 第二 、Presenter 所要实现的model 层数据回调的接口。 model 层会持有 presenter 的对象以便数据的回调。
3 、同样涉及的有内存泄漏的问题,常用的做法是 使用BaseActivity 结合 BasePresenter , 在 onCreate 方法里面 初始化 弱引用的View接口, 在 onDestroy 里面 清空弱引用内容,并且把弱引用置空。 这样可以避免内存泄漏,但是 有可能会出现 从 弱引用里面取View的时候为空,所以要做好非空判断,防止出现空指针的情况。 以下是代码 。