Android-架构(设计模式),MVC,MVP(中介者设计模式、Presenter层设计、Java四大引用、泛型)
MVP
其实日常开发中的Activity,fragment,XML界面就相当于一个MVC架构模式。
Activity中不仅要处理各种UI操作还要请求数据以及解析,这样的后果是Activity可能会有几千行代码,不便于维护,基于此现象及解耦的原则,才使用MVP进行分离代码,其次MVP便于后期的代码重用(相同的业务逻辑,不同的UI界面)
最重要的注意事项是内存泄露
内存泄露的定义
内存泄露(Memory Leak)是指程序中已动态分配的堆内存由于某种原因程序未释放或无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃。
关于内存泄露
- 定位长期,短期的内存泄露
- 造成内存泄露的原因分析
- 解决内心泄露及内存溢出
Java内存管理
Android系统是用Java语言编写的,同样遵循Java回收机制,在Java中内存有堆和栈,堆中保存的是类的对象,栈是堆内存的引用,当打开一个Activity,并在手机上退出关闭,这个时候如果Activity的对象没有在堆内存中销毁,此时被判断有内存泄露,如果这次情况过多,app就会很卡。
参考安卓MVP架构实践
应用在商业模式当中的MVP:
- 中介者设计模式
- Base基类的设计
- 静态代理生命周期
- P层的安全、内存友好设计
- APT在MVP框架中应用,提高车速
代码重构:大函数拆分(把不同功能的代码,拆分到不同的方法中)
这个initTimer()就不在这个Activity下,被剥离到SplashTimerPresenter类下
public void setTvTimer(String s) {
mTvTimer.setText(s);
}
public void cancel() {
timer.cancel();
}
MVP脱离Activity大量达美的好处就是 :假如SplashTimerPresenter()构造方法中的参数是泛型T,那么这个P层可以应用于所有相同逻辑的界面,不用去关心是哪个控件去设置这个数据,即其它Activity类重用这部分P层(强引用),
public class SplashTimerPresenter {
private final SplashActivity mActivity;
private CustomCountDownTimer timer;
/**
* 需要找到mTvTimer控件,更新相应的数据
* 可以通过构造方法,把当前对象传递SplashTimerPresenter()
*/
public SplashTimerPresenter(SplashActivity activity) {
this.mActivity = activity;
}
...
...
}
如果说Activity的生命周期和P层的生命周期不一致的话,就相当于长生命周期的对象持有Activity短生命周期的强引用
如果说这个Activity走到了OnDestroy(),但是P层有这个耗时任务和异步任务的话,它是一个长生命周期的对象,此时正持有Activity的生命周期(或说对象),虽然是已经走到了onDestroy(),但是SplashTimerPresenter的对象不会在堆内存当中,会窒息掉,就会导致一个内存泄露。
Dagger
依赖注入框架,比如省略 new xxxx()实例化过程
中介者设计模式
4个角色
- 抽象中介者-----MvpPresenter(定义接口)
- 具体中介者-----具体功能模块(例如:LoginPresenter 等)
- 抽象同事--------M层:MvpModel V层:MvpView
- 具体同事--------M层:例如:LoginModel ...... V层:l例如:MainActivity ......
类图很重要,注意(继承,依赖关联,实现),可使用https://www.freedgo.com/
四大引用
强引用(StrongReference):只要某个对象有强引用与之关联,JVM必定不会回收这个对象,即使在内存不足的情况下,JVM宁愿抛出OutOfMemory错误也不会回收这种对象。
软引用(SoftReference):对于软引用关联着的对象,只有内存不足的时候JVM才会回收该对象。
弱引用(WeakReference):用来描述非必需的对象,但JVM进行垃圾回收,无论内存是否充足,都会回收被弱引用关联的对象。
解释:当程序走到onDestroy()时,强引用就在系统中销毁了,P层引用弱引用,如果被GC扫描到的话,就会被回收掉,则不会造成内存泄露。
虚引用(PhantomReference):在任何时候都可能被垃圾回收器回收。
**
* @author jiangzq
* @description: 抽象中介者,保存和获取View层的引用
* @date :2020/5/18 19:55
*/
//泛型约束
public abstract class LifeCircleMvpPresenter<T extends IMvpView> implements ILifeCircle{
//弱引用成员变量
protected WeakReference weakReference;
protected LifeCircleMvpPresenter() {
super();
}
public LifeCircleMvpPresenter(IMvpView iMvpView) {
super();
attachView(iMvpView);
}
@Override
public void attachView(IMvpView iMvpView) {
//如果弱引用是存在的,就把它获取出来
if (weakReference == null) {
weakReference = new WeakReference(iMvpView);
} else {
//泛型体
T view = (T) weakReference.get();
//如果传递的对象不一致,则重新传一次,为确定iMvpView在P层实现数据同步
if (view != iMvpView) {
weakReference = new WeakReference(iMvpView);
}
}
}
}
代理设计模式
- 目标接口
- 目标对象
- 代理对象
上一篇: JPTabBar 详细介绍