前情提要: 最近忙(lan)的一批,说到底还是一条懒狗,周末玩游戏到天亮,睡到下午,妹崽也不理我了。我的app断断续续开了个头进展的也不是很快,在家里写代码就是舒服,可以抽烟,要是在公司也能边写代码边抽烟,我早就成了一名大牛了,哈哈哈。
进入正题,关于这篇动态代理的MVP是我很久以前在阅读某个大佬的代码demo的时候见到的,当时一头雾水,而且那个项目存在内存大量的泄漏,就没过多研究,最近想在自己项目里面用这种架构,于是想重新研究一下,百度搜一下MVP动态代理,上来就跟我大谈特谈MVC,说实话 ,我不想知道什么是MVC,因为懒,我真的不想知道,所有的文章都要拓展一下,为什么 ,┭┮﹏┭┮ 然后又用专业名词来解释专业名词,看的头大。
开始之前需要具备的知识:java泛型的用法以及注解的用法,关于注解,网上有很多讲的不错的,后续我也会继续终结下,写出来。
说实话 动态代理MVP看起来有点费劲,我找到了之前那个大佬写的代码,重头理了一下,抽出了核心的东西。如果有人对那个大佬写的源码感兴趣的话可以在下面留言。如果还没看过前两种简单的MVP的话,传送门 从0开始写一个App(一)关于 Android MVP - 简书
正因为读着费劲,写出来的东西别人看了才觉得牛批。其实我觉得除了看起来高大上没什么作用,可能是我还没到那个境界,核心思想就是所有的Presenter都通过一个代理类用工厂生成,说的还是有点抽象。继续来看张图吧,是我自己画的。我们继续用前面的计算1+1,来讨论这种MVP的流程。
上篇文章在介绍Google推荐的MVP的时候,我没去掉mode。其实google的demo里面已经弱化了model层,直接通过一些工具类啊,或者manager类来执行操作就行了。
这里我把model层也删了。所以上面的图看起来也清晰一点
包结构:
这里增加了一个BaseActivity,用于统一初始化。因为只有一个Activity继承,要不要其实都一样。
看下MainActivity:
这里自定义一个运行时的注解,把Presenter的Class传进去,由于是运行时注解,取值的时候需要用反射,编译时注解的话,需要用注解处理器,这里不做探讨,后续我会补上关于这玩意的用法,或者可以去参考其他的文章,写的都不错的。
继续来看BaseActivity:
下面的先不管,重点看这个new PresenterProxy<>(PresenterFactory.createPresenter(getClass()));
在newProxy的时候传入了工厂的静态方法createPresenter(getClass()) 写在Factory工厂里面
看下这个方法
他用反射把存储在注解中的presenter的class取了出来,注意这不是presenter对象,是class 要用的话后续得newInstance(),这里如果看的懵逼的话,去恶补下泛型吧,java基础就不用继续讨论了。
PS:注意这个方法不是泛型方法,他只是定义了一种类型
然后调用工厂的构造方法把class扔进去,
回到BaseActivity,他在OnCreate的时候有个mProxy.onCreate((V)this);这个方法,由于BaseActivity实现了IPresenterProxy接口。所以this可以强转为V,
mProxy.onCreate((V)this);是用来绑定View的。因为我们至始至终还没有看到View接口的初始化,只是MainActivity实现了而已。这里的(V)this V不是指的View,进入这个方法看下:
方法在Proxy代理里面
先看下Proxy代理里面的这个getPresenter();
他在Factory里面进行了newInstance,至此Presenter对象也就出来了
继续看:onBindView
View接口的对象丢了进去,这样getView就可以调用View的方法来通知Activity了。
然后在BaseActivity中,通过proxy代理对象可以获得的Presenter对象,在Presenter里面进行1+1的计算,通知Activity拿到结果
核心逻辑就是上面的流程,这玩意在我这个demo里面显得完全没有必要这样搞,但是正式的项目里面是有一定的作用的,一种高度的对零零散散的Presenter的封装。正如我前面的文章所说,MVP显得很冗余,因为有一堆Presenter。
个人感觉这玩意应该没多少人会看,就不贴上所有的类的内容了,感兴趣的老铁留个言,我上传github。
一直很遗憾那个大佬的源码里面没有留下任何联系方式,拜读过后收货很大,有需要的老铁同样可以留言。github有现成的。
妈的。写完又是半夜两点半,明天上班又拉闸,呜呜呜,睡了。