前言
在字节学到一招。
刚来字节,发现字节内部的技术真的很牛逼,一后会不定期更新博客,记录一下自己在头条这边的学习历程。
跨模块View通信
我们都知道,当某块A想使用模块B里面的View时,有两种方式
- 抽象出接口,通过依赖接口IView和管理类ServerManager,动态添加view,缺点是只能动态添加,不能在xml里面直接使用,也无法预览。(注意,这里的IView和ServerManager需要统一在common模块)
- 把模块B里面的View直接下沉到更底层去。
前面这两个是最通用的方法,一般第二种方法居多,但是当模块很多,并且只有两个模块需要这个view时,下沉就显得很没必要了。
下面说说字节的方法。
字节是采用了占位符的方式,提供了一个PlacePositionView来代替view,提供两个自定义属性,一个是公有的CommonServer属性,用来生成view,还有一个时view的名字name,当模块A传入name与CommonServer中的string对应上时,就返回view。可能这里还是有疑问,也就是最大的疑问:那就是怎么解析这个View?这个View不是动态生成的,而是放在xml里面的,既然如此,如何让我们的View能够在xml里面被识别呢?
说到这里,我们可以想一想xml是由什么来解析的?没错,就是由layoutInflater.inflate()来解析的,那么,我们是否能够在layoutInflater里面做些手脚,来实现这一流程呢?其实时可以的,给出hongyang的参考链接Android “退一步”的布局加载优化,读过这篇文章,我相信你一定有印象,我们的layoutFlater有三个Factory,分别是Factory,Factory2以及mPrivateFactory,只有这三个factory都解析失败,才会走反射那一套,那么,我们使用哪一个呢?让我们来看看那一段源代码。
@Unsup