MVP系列文章(三) - 动态代理优化每次判断 View != null

前言

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: [email protected]
 * Created by Novate 2018/7/7 15:40
 * Version 1.0
 * Params:
 * Description:    动态代理优化 View != null
*/

public class BasePresenter {

    // 目前来讲有2个公用方法 , 传递的时候 会有不同的View , 怎么办? 采用泛型

    private WeakReference mViewReference ;
    private V mProxyView;

    // View一般都是Activity,可能会涉及到内存泄露的问题,但是已经解绑了就不会内存泄露,
    // 这里最好还是用一下软引用



    public void attach(V view){
//        this.mView = view ;

        this.mViewReference = new WeakReference(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

你可能感兴趣的:(MVP系列文章(三) - 动态代理优化每次判断 View != null)