EventBus在Activity中的使用:
子線程發(fā)送消息到主線程更新UI
- 注冊
在一個Activity創(chuàng)建的時候注冊eventbus事件
@Override
public void initUI() {
setContentView(R.layout.activity_event_bus);
ButterKnife.bind(this);
//訂閱注冊
EventBus
.getDefault()
.register(this);
}
- 注銷
在Activity銷毀的時候注銷eventbus事件
@Override
protected void onDestroy() {
super.onDestroy();
//訂閱注銷
EventBus
.getDefault()
.unregister(this);
}
-
訂閱者接收事件
定義一個方法戈稿,傳入String參數(shù)阵苇,在其中操作UI操作.
添加注解@Subscribe动猬,其含義為訂閱者捎稚,在其內(nèi)傳入了線程模式,
定義為ThreadMode.MainThread拥褂,其含義為該方法在UI線程完成.
//訂閱接收事件
@Subscribe(threadMode = ThreadMode.MAIN)
public void onMessageEvent(String event) {
tvShow.setText(event);
}
-
發(fā)布者發(fā)送消息
既然訂閱了內(nèi)容娘锁,當(dāng)然就會發(fā)布消息。例如我們可以在子線程發(fā)送消息到主線程更新UI.
你的接收信息為String類型饺鹃,那么在post的時候莫秆,你post出去的也應(yīng)該是String類型,其才會接收到消息.
private void thread() {
new Thread(new Runnable() {
@Override
public void run() {
//發(fā)送訂閱的事件.
EventBus
.getDefault()
.post("messag is from thread by eventbus... ...");
}
}).start();
}
- 發(fā)布者發(fā)送對象消息
如果你post的是對象,首先你需要定義一個類作為事件載體
public class MessageEvent extends BaseEvent {
public MessageEvent(String message) {
super(message);
}
}
然后你post的時候傳第一個對象:
private void thread3() {
new Thread(new Runnable() {
@Override
public void run() {
//發(fā)送訂閱的事件.
MessageEvent event
= new MessageEvent("MessageEvent obj is from thread3 by eventbus ...");
EventBus
.getDefault()
.post(event);
}
})
.start();
}
當(dāng)然悔详,你接收的方法也需要修改接收的數(shù)據(jù)類型:
//訂閱接收事件對象
@Subscribe(threadMode = ThreadMode.MAIN)
public void handleSomethingElse(MessageEvent event) {
LogUtils.i("handleSomethingElse---->" + event.message);
tvShow.setText(event.message);
}