MVP系列文章(三) - 动态代理优化每次判断 View !=
2018-07-15 本文已影响336人
世道无情
前言
MVP系列文章
MVP系列文章(一) - MVC 与 MVP
MVP系列文章(二) - 优化attach()、detach()方法
MVP系列文章(三) - 动态代理优化每次判断 View != null
MVP系列文章(四)- GC回收原理分析
MVP系列文章(五)- 泛型擦除
MVP系列文章(六)- 代码架构与运行时架构
MVP系列文章(七)- 知识梳理
1. 动态代理优化每次判断 View != null
每次都要去判断 View != null,很麻烦,在BasePresenter中使用动态代理优化:
由于View都是接口,通用代码 View != null统一处理,这个是AOP思想(aspectJ、动态代理),这里就采用动态代理优化
/**
* Email: 2185134304@qq.com
* Created by Novate 2018/7/7 15:40
* Version 1.0
* Params:
* Description: 动态代理优化 View != null
*/
public class BasePresenter<V extends BaseView> {
// 目前来讲有2个公用方法 , 传递的时候 会有不同的View , 怎么办? 采用泛型
private WeakReference<V> mViewReference ;
private V mProxyView;
// View一般都是Activity,可能会涉及到内存泄露的问题,但是已经解绑了就不会内存泄露,
// 这里最好还是用一下软引用
public void attach(V view){
// this.mView = view ;
this.mViewReference = new WeakReference<V>(view) ;
// 用代理对象 动态代理
mProxyView = (V) Proxy.newProxyInstance(view.getClass().getClassLoader(), view.getClass().getInterfaces(), new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
// 动态代理每次都会执行这个方法,调用的是被代理的对象(就是mView)
if (mViewReference == null || mViewReference.get() == null) {
return null ;
}else{
return method.invoke(mViewReference.get(), args);
}
}
});
}
public void detach(){
this.mViewReference.clear();
this.mViewReference = null ;
this.mProxyView = null ;
}
public V getView(){
return mProxyView ;
}
}
代码已上传至github:
https://github.com/shuai999/Architect_day37.git
GC回收算法
https://www.cnblogs.com/sunfie/p/5125283.html