最近项目上经常会用到otto框架,它跟EventBus很像,这里希望总结一下:
- 运行时动态处理(注解)
- IOC 控制反转
- 观察者模式 EventBus模式
大体上要学习otto框架就是上面三个方面,看着名词很高端?没事,让我一一解释一下。
一 . 运行时动态处理(注解)
我们最初学习安卓的时候最先接触的类恐怕就是Activity了吧,在里面onCreate()这些方法会要求我们重写,在上面会有一个注解@Override,难道仅仅起到注释的作用吗?其实注解分为两种
① 运行时动态处理:在运行时拿到类的Class对象,然后遍历其方法、变量,判断有无注解声明,然后做一些事情
② 编译时动态处理:这类注解会在编译的时候,根据注解标识,动态生成一些类或者生成一些xml都可以,在运行时期,这类注解是没有的~~会依靠动态生成的类做一些操作,因为没有反射,效率和直接调用方法没什么区别
今天我们只研究运行时动态处理。
有句话说得好,叫无反射没框架。
任何框架都离不开反射,反射以前只在书本上了解过就是运行时获取对象的类方法,变量吗.现在反射在速度上已经有了很大的提高,我们完全不必担心性能方面会变差很多。
说了半天,你只要记住注解,作为一种标志,可以帮你在你的类加载时替你记住那些你希望以后用来调用的方法和对象。
在otto中最重要的两个注解就是@Subscribe和@Produce,这两个是什么作用等下再说。
二 . IOC 控制反转
什么事IOC控制反转?
当A类想使用B类的一个方法时,我们传统的做法是new一个B类实例出来,再去调用方法,但是这就使得A,B两个类纠缠在一起。当我们改变了B类时,所有调用了B类的文件我们都需要去改,这样是不是太麻烦,好的做法是写一个主线类,它会自动帮我们去注入(new),当我们需要改动时,只要改这个主线类就可以了。这个主线类也就是我要提到的otto框架中的Bus类,这是otto最重要的类,它有什么作用?这玩意就是在类加载时调用register,扫描类中复合命名规范的方法,存到一个map,然后post的时候,查找到匹配的方法,反射调用。不理解?等下我们举个例子你就明白了,现在我们先解释完名词。
三 . 观察者模式 EventBus模式
otto框架是基于EventBus框架,这是一个是一个发布 / 订阅的事件总线,大家可以看下鸿洋大神的这篇Android EventBus实战 没听过你就out了讲的特别好
四 . 应用实战
任何一个App都一定会提供软件更新功能,当我们在更新过程中突然不想更新了,点击了取消,让我们的代码去调用SplashActivity里面的DoCancelUpdate方法。由于我们的下载更新类是写在UpdateManager类里面,那我们怎么做呢,没学会otto框架之前我们可能会在新建UpdateManager时传进去一个Context,这会不会导致Context引发的内存泄漏,我们需要很小心的检查,现在我们使用otto框架就不需要担心这个问题,因为他们两人几乎没有交集,他们都是通过Bus类来沟通。废话不多说上代码:
1 . SplashActivity中让bus注册,并订阅事件
@Override
protected void onCreate(Bundle arg0) {
super.onCreate(arg0);
BusProvider.getInstance().register(this);
setContentView(getLayoutResource());
}
@Subscribe
public void DoCancelUpdate(CancelUpdateEvent event){
continueRun();
}
2 . BusProvider为一个单例模式类,Bus最好只有一个
public class BusProvider {
public static Bus bus;
public static Bus getInstance() {
if (bus == null) {
bus = new Bus(ThreadEnforcer.ANY);
}
return bus;
}
private BusProvider() {
}
}
3 . UpdateManager类中使用post发出事件,凡是订阅了的都会调用
BusProvider.bus.post(new CancelUpdateEvent());
至此算是完成了otto框架的总结,分享一些自己在找资料时遇到的大神博客文章:
Android EventBus实战 没听过你就out了
Android 进阶 教你打造 Android 中的 IOC 框架