使用EvnetBus可以實作Android各大元件之間的通信(跨程序呢?應該不能。但是廣播就可以。)
第一步:下載下傳 EventBus 類,
https://github.com/greenrobot/EventBus,也可以直接下載下傳我打包的jar包
第二步:訂閱事件:
EventBus mEventBus = EventBus.getDefault();
mEventBus.register(this);
第三步:1. 編寫響應函數,需要自定義事件類,EventOne
public void onEvent(EventOne event){
}
第四步:釋出事件
EventBus.getDefault().post(new EventOne());
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final EventBus bus = new EventBus();
bus.register(this);
new Thread() {
@Override
public void run() {
super.run();
try {
sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
}
bus.post(new EventOne("this is a test event"));
}
}.start();
}
public void onEvent(EventOne event) {
System.out.println("@@@@ recv " + event.getEvent());
}
}
onEvent:如果使用onEvent作為訂閱函數,那麼該事件在哪個線程釋出出來的,onEvent就會在這個線程中運作,也就是說釋出事件和接收事件線程在同一個線程。使用這個方法時,在onEvent方法中不能執行耗時操作,如果執行耗時操作容易導緻事件分發延遲。
onEventMainThread:如果使用onEventMainThread作為訂閱函數,那麼不論事件是在哪個線程中釋出出來的,onEventMainThread都會在UI線程中執行,接收事件就會在UI線程中運作,這個在Android中是非常有用的,因為在Android中隻能在UI線程中跟新UI,是以在onEvnetMainThread方法中是不能執行耗時操作的。
onEventBackground:如果使用onEventBackgrond作為訂閱函數,那麼如果事件是在UI線程中釋出出來的,那麼onEventBackground就會在子線程中運作,如果事件本來就是子線程中釋出出來的,那麼onEventBackground函數直接在該子線程中執行。
onEventAsync:使用這個函數作為訂閱函數,那麼無論事件在哪個線程釋出,都會建立新的子線程在執行onEventAsync.
上面一段轉的 EventBus使用詳解(二)——EventBus使用進階
如果事件函數的參數和post的參數一樣則該事件函數就會被調用。寫了多個事件函數,則這些事件函數都會被調用。