今天学习了Otto框架,官网地址https://github.com/square/otto
如何在android studio开发环境下使用Otto呢?
1 添加模块依赖
步骤:打开官网地址,复制compile 'com.squareup:otto:1.3.8' 这一句 到模块的build.gradle的dependencies节点下。
2 在android studio开发环境中使用Otto,主要使用com.squareup.otto.Bus类和@Produce、 @Subscribe 注解。
其中Bus类提供了register注册,unregister取消注册和post发布事件
@Produce注解:生产事件
@Subscribe注解:订阅事件
3 具体实现步骤如下
1)构造一个Bus对象 Bus bus = new Bus();
在Activity类的onResume方法中注册:bus.register(this);
在onPause方法中取消注册:bus.unregister(this);
2)定义一个实体类,如下:
private class MyEvent {
private int mValue ;
public MyEvent(int value) {
this.mValue = value;
}
public int getValue(){
return mValue;
}
}
3)定义一个事件产生的函数,使用@Produce注解修饰,@Produce告诉Bus该函数是一个事件生产者,产生的事件类型为该函数的返回值:
@Produce
public MyEvent produceMyEvent() {
return new MyEvent(100);
}
4)定义一个订阅事件的函数,使用
@Subscribe注解修饰,告诉Bus该函数订阅了一个事件,该事件的类型为该函数的参数类型:
@Subscribe
public void onMyEvent(MyEvent event){
int value = event.getValue();
System.out.println("value is" + value);
}
5)调用bus.post方法发送一个事件,如下:
bus.post(produceMyEvent());
一个Activity既可以是事件的生产者又是事件的订阅者。
事件生产者和订阅者,都需要Bus注册和解注册,所以整个代码如下:
public class MainActivity extends AppCompatActivity {
private Bus bus;
private Button mButton;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mButton = (Button)findViewById(R.id.button);
mButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//发送一个事件
bus.post(produceMyEvent());
}
});
bus = new Bus();
}
@Override
protected void onResume() {
super.onResume();
bus.register(this);
}
@Override
protected void onPause() {
super.onPause();
bus.unregister(this);
}
@Produce
public MyEvent produceMyEvent() {
return new MyEvent(100);
}
@Subscribe
public void onMyEvent(MyEvent event){
int value = event.getValue();
System.out.println("value is" + value);
}
private class MyEvent {
private int mValue ;
public MyEvent(int value) {
this.mValue = value;
}
public int getValue(){
return mValue;
}
}
}
参考:
http://blog.chengyunfeng.com/?p=450
https://gist.github.com/JakeWharton/3057437