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,防止內存泄露。

相關文章
相關標籤/搜索