美文网首页1-Android开发知识
MVP系列文章(三) - 动态代理优化每次判断 View !=

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

作者: 世道无情 | 来源:发表于2018-07-15 11:27 被阅读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

    相关文章

      网友评论

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

        本文链接:https://www.haomeiwen.com/subject/kcowuftx.html