Otto是android 事件总线 EventBus模式的一个框架
在Module的build.gradle中添加如下语句:
// Event bus. compile 'com.squareup:otto:1.3.5'我们可以写一个App类继承Application使得Bus实例在程序运行初始就得到初始化,也可以单独写一个BusProvider的类在需要的时候直接使用其中已经初始化的Bus对象。在这里我使用App类:
public class App extends Application { public static Bus bus; @Override public void onCreate() { super.onCreate(); // Bus must be created before we do anything else as other components want to post on it. bus = new Bus(ThreadEnforcer.ANY); } }然后我们可以在MainActivity的onResume方法中注册并在onPause方法中取消注册(注销)语句如下:
@Override protected void onResume() { super.onResume(); App.bus.register(this); } @Override protected void onPause() { super.onPause(); App.bus.unregister(this); }然后到了最关键的地方,也就是这个框架的核心功能。我们需要产生一个事件,一个或多个订阅者,还需要一个发布函数(post方法可以直接使用):
首先我们写一个事件类并在MainActivity中写一个产生事件的函数并且通过点击按钮的事件发布出去(如果你直接将post事件写在MainActivity的onCreate方法中,那么你不可能将事件发布出去,尽管不会报错,因为onCreate()方法在onResume()方法之前):
public class NewEvent { public String message; public NewEvent(String message) { this.message = message; } }
public NewEvent produceNewEvent() { return new NewEvent("this is changed String"); }
App.bus.post(produceNewEvent());
我为什么没有在produceNewEvent方法上加@produce注解呢?因为加上之后即使不点击按钮事件也会在程序运行时自己发布出去。
为了方便起见我们就不再新建一个类,而直接把订阅者写在MainActivity中(因为其原理是找寻具有@Subscribe注解的函数去执行,和类本身没有关系):
//订阅者A @Subscribe public void onEventA(NewEvent newEvent) { Log.i(TAG, "This is 订阅者A"); } //订阅者B @Subscribe public void onEventB(NewEvent newEvent) { Log.i(TAG, "This is 订阅者B"); }
我们写两个订阅事件是为了说明订阅者之间接收消息是没有先后顺序的。(但是我测试的结果总是订阅者A先响应)
一开始我居然忘记加上@Subscribe注解,真是的。
最后调试结果如下:
06-30 10:27:08.810 8454-8454/com.myapplication I/MainActivity: This is 订阅者A
06-30 10:27:08.810 8454-8454/com.myapplication I/MainActivity: This is 订阅者B
06-30 10:27:11.372 8454-8454/com.myapplication I/MainActivity: This is 订阅者A
06-30 10:27:11.372 8454-8454/com.myapplication I/MainActivity: This is 订阅者B
06-30 10:27:13.007 8454-8454/com.myapplication I/MainActivity: This is 订阅者A
06-30 10:27:13.007 8454-8454/com.myapplication I/MainActivity: This is 订阅者B
后面我还要再深入学习一下这个Otto框架,请看另一篇博客,哦不好意思,我还没写呢。
要不,我给您唱首歌:http://changba.com/s/AdwbB4FU-ZW6n7vEyIWZbQ?&code=Kxhsv6044ik&from=pcrecommend
见笑了