一种用 Proxy 解决继承依赖的方法

一种用 Proxy 解决继承依赖的方法问题思路解决遗留问题 问题 在项目拆分的过程中,一定会遇到依赖问题。有一些代码非常细节,不适合作为对外接口暴露给上层,而上层很可能需要继承自这些类。 例如,App 级别的 WebViewClient 的封装。作为业务 common 层的代码,包含了极多的业务逻...

2018-10-10 18:59:28

阅读数:30

评论数:0

快手组件化之术——IoC自注册

自己在公司简书上的文章,转一发:https://www.jianshu.com/p/ea944773cbd5 道势术,以势养道,以术谋势。 —— 《道德经》 阅读本文需要对 Java 组件化、Annotation processing 和 Javassist 有一定了解。   当一个...

2018-07-10 10:18:15

阅读数:60

评论数:0

ButterKnife 是怎么解决 library 的 R 问题的

问题 Annotation 中必须引用 final 的值(编译期已经有最终值),而 ButterKnife 中引用的 R (在 library 工程中)是非 final 的。 ButterKnife 的 tricks 生成 R2 既然 R 不是 final 的,生成一个呗。所以 butte...

2018-07-03 17:10:31

阅读数:430

评论数:0

怎样发布同一个库到多个repo中

问题 在开发过程中,有时需要同时发布一份aar/jar到远程和本地的repo,这样可以保证在没有网的情况下编译成功。 解决 不可能在uploadArchive任务中设置多个repo,因为源码里明显写的只有单个repository对象。所以需要手写一个Upload task的子类。 里面有的...

2018-05-23 18:24:08

阅读数:128

评论数:0

[脑洞]使用annotation生成反射常量池

问题 反射是每个Java开发都躲不开的工具,很多时候可以用反射把代码写的非常整洁,但会付出两个代价: 性能问题 反射用字面量和对应的类需要维护,容易出现bug 前者是不可避免的,而后者可以通过apt来维护。 以前都是用apt/javassist减少反射,后面做首个dex减肥发现,有的反...

2018-05-07 16:13:14

阅读数:104

评论数:0

[源码]Meepo路由

之前设计框架、面试、调研等等的时候,一直觉得ARouter这种完全靠字符串 + 野性Builder的模式太随性。后面YY出来两个可行的方案: 为每个页面/Uri生成一个Builder类,用专有Builder进行编译期校验。现存的是https://github.com/joyrun/Activi...

2018-04-23 11:54:46

阅读数:55

评论数:0

我用过的代码生成方式综述

这段时间,做了很多开发效率相关的事情,涉及到了不少代码生成的方法和思路,总结如下。生成代码分两部分:代码分析生成工具和代码模板 工具 按编写难度排序 live template 这个是intellij的一个简单工具,看起来就是对freemarker或者正则替换做了一些封装。代表方案当然...

2018-03-22 14:57:07

阅读数:122

评论数:0

[脑洞]复杂页面构建方法

问题 每个App都不可避免有一两个复杂的页面,首页啦、主要功能的detail页啦都跑不掉又臭又长。而当海外成为理所应当拓展的市场时,解耦复杂页面、在页面中按需加入功能就是一个刚需了。 具体来说,解耦有几个方面:接口/功能的解耦、View层面(特别是id)的解耦、生命周期传递。 通用解决 ...

2018-03-02 18:05:47

阅读数:76

评论数:0

[源码]从CoordinatorLayout到集合中通信

CoordinatorLayout是个挺古老的东西了,然而我才听说,愧为程序员。看一下源码,缓解一下。 一个ViewGroup,也没啥设计思路可说的,无非是:使用Mediator模式解决了集合中子元素的随意通信问题(DependOn),用Decor模式解决了无谓继承的问题(代理给出了不少View...

2018-02-24 19:11:06

阅读数:56

评论数:0

[造轮子]一个关于IOC初始化的失败脑洞

问题 所有IOC系统,都不可避免的要进行实现的注册,包括很多初始化相关的事情。在Android上,随便一个多module的App,多多少少都有相同的问题。 Android冷启动App,IOC系统启动时,基本都要反射来突破Module间依赖的限制(如果这个能解决,也就不需要IOC了)。此时,性能...

2018-02-13 18:28:38

阅读数:90

评论数:0

[源码]TextView源码

提起TextView,脑子里想着用起来应该是很简单的,然而作为显示文字的所有控件的基类,想要完全挖掘出TextView的能力,还是很复杂的。最近做一个需求,要在限制长度的输入框里识别粘贴的淘口令,因为对TextView了解太肤浅,bug无数,特意看一下源码学习一下(听iOS同学说,各个平台的对外接...

2018-01-18 16:24:25

阅读数:172

评论数:0

[java-design-patterns]Enum和Factory模式的替换

设计模式合集git笔记系列。 abstract factory模式的介绍中 创建了KingdomFactory的接口 分别实现了ElfKingdomFactory和OrcKingdomFactory 为每个KingdomFactory声明了相应的enum 声明了KingdomFactory的...

2018-01-10 11:01:43

阅读数:140

评论数:0

AOP Observable

在公司重构的过程中,希望用KVO的方式传递数据变化的事件。然而,在传统Android的写法中,Bean是没有setter的,就没有时机来notifyObservers了。 值得庆幸的是AspectJ能够切入Field access事件,用AOP就是一个非常好的解决方法了。项目](https://...

2017-11-10 15:03:21

阅读数:86

评论数:0

[架构]复杂App MVC重构小结

在公司做MVP重构,公司蛮大的,App也蛮复杂(显示逻辑上,业务转移上基本是用户操作驱动,而非业务逻辑驱动),所以是个大MVP,三端都非常臃肿。自然会用拆分来解决问题,同时参照了谷歌官方的架构模型。ModelModel是数据层,该层是面向业务数据进行拆分的。安照SOLID思路,将Model拆成两层...

2017-11-02 11:34:21

阅读数:163

评论数:0

跨Activity KVO问题思考

大部分展示类App都是Summary->Detail结构的,Detail中常常包含了对Model的修改。如何同步Model和View的状态是一个常见的问题。Android architecturegoogle官方的方案是ViewModel、LiveData ViewModel ViewMod...

2017-10-30 17:22:49

阅读数:174

评论数:0

AspectJ 生成的代码粗读

拜读大神的Hugo代码,代码很简单,就是AOP加日志。然而日志必然影响性能,特意反编译AOP之后的代码,了解一下AspectJ AOP的一些皮毛。 这里只是AOP一个普通方法的影响。主要关注内存和反射。探索编译期会把原始方法改名,把真实方法改成调用AOP对应的方法。初始化会为每一个AOP方法生成...

2017-10-25 14:04:27

阅读数:187

评论数:0

[源码]ButterKnife代码

自己做AnnotationProcessing 用的visiter模式。看一下大牛(真是个巨大的牛)是怎么做的。项目主要功能: processing:compiler,做annotation processing plugin:plugin,复制R2用,主要是为了弱鸡的annotation lib...

2017-10-24 18:58:17

阅读数:106

评论数:0

用Annotation简化Preference存储

现状有很多Preference来自于某些对象的字段,这些字段的存储其实非常繁琐,每增加一个字段,需要修改3个地方: key 对象字段 对象内容的存储 目标是搞成单点修改,但是: 受限于java的Annotation限制很多,对于泛型、继承支持不太好,很难跟Preference的能力对应上 不太想做...

2017-09-29 14:30:48

阅读数:139

评论数:0

Fragment生命周期的奇怪设定

线上发生了一个神奇的问题:fragment在onCreate的时候初始化数据,判断异常并finishActivity。然而居然走到了onViewCreated… 原因是Fragment的生命周期的调用关系跟臆想的不一样。在FragmentManager内部,Fragment会有几个[状态](ht...

2017-08-16 11:04:51

阅读数:138

评论数:0

Theme读取的工具类

用TypedArray读Theme很麻烦,很机械。可以用annotation来搞定。 public static void fillObject(Context context, Object object) { Class clazz = object.getClass(); ...

2017-08-15 16:00:33

阅读数:134

评论数:0

提示
确定要删除当前文章?
取消 删除
关闭
关闭