第一次写简书,只为了把平时用到的知识记录保存下来,同时也希望能对又需要的学者有帮助。
今天刚好用了大名鼎鼎的Otto,Otto是一个事件总线,可以替代Intent、Handler和BroadcastReceiver 在四大组件之间传递消息,而且开销极小,同时能让我们的代码更加优雅,还有一个大大的好处就是可以将消息发送者和接收者解耦。好了,说了这么多,那就让我们来看看Otto到底是个什么东东吧。
首先献上官网:http://square.github.io/otto/
首先让我们了解下Otto的使用场景,由Activity、FragmentA、FragmentB组成,其中Activity管理者Fragment,可以点击FragmentA的Button从而更新FragmentB的UI。
这种场景我们当然可以用startActivityResult 和接口的方式来实现,但是会产生很多种状态和逻辑判断,并且可能会不必要的bug和繁琐的代码,更重要的是处理不好的话会内存泄漏,所以使用Otto就能很容易解决这些问题。
基本用法:
在Android Studio中配置
dependencies {
compile 'com.squareup:otto:1.3.8'
}
订阅和取消订阅
bus.register(this);
bus.unregister(this);
发布:
bus.post(new MessageEvent());
注解
@Subscribe:这个在调用了register后有效,表示订阅了一个事件,并且方法的用 public 修饰的.方法名可以随意取,重点是参数,它是根据你的参数进行判断
@Produce注解告诉Bus该函数是一个事件产生者,产生的事件类型为该函数的返回值。
最后我们还要在我们的proguard-project.txt文件添加以下代码,防止混淆。
-keepattributes *Annotation*
-keepclassmembers class ** {
@com.squareup.otto.Subscribe public *;
@com.squareup.otto.Produce public *;
}
接下来就是一个简单的例子:
首先是一个单例
public class SingleOtto {
private static final SingleOtto otto = null
public static SingleOtto getInstance() {
if(otto = null){
otto = new SingleOtto();
}
return otto;
}
private SingleOtto() {}
}
定义一个消息实体
public class MessageEvent {
public String msg;
public MessageEvent(String msg) {
this.msg = msg;
}
}
Activity , 事件订阅
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
findViewById(R.id.button).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
SingleOtto.getInstance().post(new MessageEvent("hehehe"));//发布事件
}
});
}
@Override
protected void onResume() {
super.onResume();
SingleOtto.getInstance().register(this);//注册
}
@Override
protected void onPause() {
super.onPause();
SingleOtto.getInstance().unregister(this);//注销
}
@Subscribe //订阅事件MessageEvent
public void receiveEvent1(MessageEvent event){
Log.i("otto", "hello");
}
@Subscribe //订阅事件
public void receiveEvent2(MessageEvent event){
Log.i("otto", "world");
}
@Produce //产生事件
public MessageEvent sendEvent(){
return new MessageEvent("this is my world ~~~");
}
}
Otto最简单的使用就到此了。
网友评论