Android事件总线框架Otto

一、下载EventBus的类库java

源码:https://github.com/square/ottogit

二、基本使用github

@Subscribeide

订阅事件,也就是事件的处理者,它有且仅有一个参数YourEvent,每个Subscribe对应处理一个YourEvent。Event用于链接(匹配)post和订阅。@Subscribe使用举例:post

@Subscribe
public void reveiverMethod(YourEvent event){
   //...TODO 
}

@Produce
this

产生事件,改方法在对象被register后即被调用(–使用状况比较特殊的),该方法必须有一个非空的返回值,参数必须为空。 bus.post(new YourEvent(…))spa

发送一个事件,等待@Subcribe处理debug

public class MainActivity extends Activity {
 
    TextView tvShow;
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        BusManager.getInstance().register(this);
        System.out.println(debug:onCreate);
        setContentView(R.layout.activity_main);
        findViewById(R.id.btn_1).setOnClickListener(new OnClickListener() {
 
            @Override
            public void onClick(View arg0) {
                BusManager.getInstance().post(new MyEvent(将我点击的内容,发送出去));
            }
        });
        tvShow = (TextView) findViewById(R.id.tv_show);
    }
 
    @Override
    protected void onDestroy() {
        super.onDestroy();
        BusManager.getInstance().unregister(this);
    }
 
    @Subscribe
    public void receiveEventByParam(MyEvent event) {
        System.out.println(debug: + event.getContent());
        if (tvShow != null) {
            tvShow.setText(event.getContent());
        }
    }
 
    @Produce
    public MyEvent sendEvent() {
        return new MyEvent(这是我产生的事件(@Produce));
    }
}

BusManager 是一个单例code

public class BusManager {
    private static Bus bus = null;
    private BusManager() {
    }
    public static synchronized Bus getInstance() {
        if (bus == null) {
            bus = new Bus();
        }
        return bus;
    }
}

MyEvent 本身定义的事件类orm

public class MyEvent {
    private String content;
 
    public String getContent() {
        return content;
    }
 
    public void setContent(String content) {
        this.content = content;
    }
 
    public MyEvent(){
 
    }
 
    public MyEvent(String content) {
        super();
        this.content = content;
    }
 
}

运行结果

05-20 20:41:59.923: I/System.out(30320): debug:这是我产生的事件(@Produce)
05-20 20:41:59.923: I/System.out(30320): debug:onCreate
05-20 20:42:11.553: I/System.out(30320): debug:将我点击的内容,发送出去

每次调用registe()方法是,会当即调用@Produce方法,将return的事件发送出去,由参数为MyEvent的@Subscribe方法接收并处理。bus.post()也是如此。


原理

主要是Bus.java里面的代码:

关键的方法有:

public void register(Object object)

该方法的做用是查找object里面全部带有Produce和Subscribe注解的方法,并保存在Map中,而且会当即执行Produce注解的方法。

public void post(Object event)

发送事件event,根据以前注册过的object里面的方法,查找参数为event的Subscribe方法,并invoke该方法。这样就达到了post以后,调用对应Subscribe方法的目的。

public void unregister(Object object)

注销object,删除掉map中保存的object的方法,释放object,防止内存泄露。

相关文章
相关标签/搜索