当前位置: 首页 > 工具软件 > RoboBinding > 使用案例 >

[源码]RoboBinding及思考

东方海
2023-12-01

RoboBinding是个有年头的MVVM框架,想看他源码好像也有段时间了,终于下定决心看一下了。

看个大概

主要是想了解一下作者的实现思路,鉴于代码实在是太松耦合、类实在太多,也没动力看细节了。

思路

表示,整个框架解耦太厉害了,出现了无数单实现的interface,也就是说,整个框架都是靠着interface联系在一起的。可能这类猿才会做出MVVM+自动化测试的框架吧。
编译时把PresentationModel的信息搞出来,并且生成一个对应的描述类,供运行时使用。
运行时流程:
- 给LayoutInflater设置Factory和Factory2回调,hook View的创建
- 根据PresentationModel创建绑定的BindContext,里面有绑定的信息
- 对于每一个数据绑定,都有一个Command与之对应,被观察者有变化的时候,会执行Command的call函数
- PresentationModel的变化监听是靠AspectJ或者直接调用firePropertyChange实现的

合理设计

  • 提供快捷调用接口——Binders
  • 用定制化的Exception做预校验,所有异常都抛出,不做if-return判断——Preconditions
  • 解耦是双刃剑,要适度啊。要不然逻辑满天都是,更难看懂
  • Factory是不能够拿到Inflate之后的View对象的,涉及到了一个源码的功能:
    LayoutInflater的inflate都是由factory实现的,会有一个default的Factory放在mPrivateFactory,需要反射出来作为delegate来获取View

思考

这个是个高端实现,用到了编译时的Annotation处理(最近看的和写的几个框架都用到了这个),减少了反射、代码也更优雅。让我想起来ORMLite,那其实还有个GreenDAO的实现思路(非常喜欢greenrobot的调性,变通一下,世界就清净了)。
MVVM核心就是绑定对象的Field和View的某个属性(当然是靠setter方法),如果VM本身是预定义好的,那么必须使用RoboBinding的思路来搞,但是,如果VM是生成的呢?
如果把MVVM交给greenrobot来做,那么,VM一定是生成的,VM实现Observable。而绑定的功能仅仅是靠Factory注册一个Observer,Observer进行View的修改。
这个方法只完成了Field的绑定,对于事件的绑定,似乎没有什么特别友好的方式。除非是用上clean-architecture的思路,把Presenter/VM中的处理逻辑都封装成原子Command,VM靠Command来实现逻辑。或者是用ButterKnife的方式,Annotation+反射,而这时,就要用比较复杂的逻辑把生成的代码和手写的代码粘合到一起了(用EventHandler)。

 类似资料: