我有一个子演示者(添加到插槽中的父节点),eventBus在onBind()调用时通过(在条件下)触发事件:
class ChildPresenter extends PresenterWidget<?> {
void onBind() {
instance = initMyInstance();
if (instance == null) {
eventBus.fireEvent(new MyEvent());
}
}
//...
}
Run Code Online (Sandbox Code Playgroud)
在父级上,我在onBind()方法中处理事件,如下所示:
class ParentPresenter extends Presenter<..>{
void onBind() {
eventBus.addHandler(MyEvent.TYPE, new MyEventHandler() {...} );
}
}
Run Code Online (Sandbox Code Playgroud)
我也试过这个父:addRegisteredHandler(LoggedOutEvent.TYPE, this)和 addVisibleHandler(...)太,在这里我实现MyEventHandler父演示接口,但它不处理触发的事件.
我做错了吗?我也注意到当我将处理过程移动到onReveal()我的父母演示者的方法时,它工作了两次!!
Otto如何处理不同的事件类?可以有不同的事件类吗?
只有听取特定事件类的听众才会收到通知吗?例如下面的示例是否可以工作,只有A类中的监听器被通知?假设EventClassA并且EventClassB不扩展相同的超类.
class A {
@Subscribe
public void handleEvent(EventClassA event)
{
//
}
}
class B {
@Subscribe
public void handleEvent(EventClassB event)
{
//
}
}
class C {
public void postEvent() {
bus.post(new EventClassA());
}
}
Run Code Online (Sandbox Code Playgroud) 我对使用事件总线并不陌生,但是在以下情况下出现了奇怪的行为:
我有MainActivity,其中有两个片段需要使用Otto从MainActivity启动的SecondActivity中的事件总线来更新其内容。问题是,当SecondActivity启动时,MainActivity暂停,因此,该总线将在其onPause方法内取消注册,并且EventBus从SecondActivity触发其事件时,MainActivity下的两个片段将不会接收到该总线。
顺便说一句,MainActivity有一个订户方法来从AsyncTask线程接收更新,因此它也应该注册和注销事件总线。
这是我的BusProvider课程代码:
public class BusProvider {
private static final Bus BUS = new Bus(ThreadEnforcer.ANY);
public static Bus getInstance() {
return BUS;
}
private BusProvider() {
}
}
Run Code Online (Sandbox Code Playgroud)
这是我的MainActivity事件总线代码:
@Override
protected void onResume() {
super.onResume();
bus.register(this);
}
@Override
protected void onPause() {
super.onPause();
bus.unregister(this);
}
@Subscribe
public void onAsyncResult(SomeEvent event) {
// do something
}
Run Code Online (Sandbox Code Playgroud)
这是我的FragmentA和FragmentB事件总线代码:
@Override
protected void onResume() {
super.onResume();
bus.register(this);
}
@Override
protected void onPause() { …Run Code Online (Sandbox Code Playgroud) 我正在循环具有子组件的根组件。
<root-select v-for="offer in offers" >
<child-options v-for="item in options" >
</child-options>
</root-select>
Run Code Online (Sandbox Code Playgroud)
但是,当我$emit从 child 获取 root 函数时,我所有的 root 组件都更改了这些数据。
孩子:
EventBus.$emit('toggle', value);
Run Code Online (Sandbox Code Playgroud)
根:
EventBus.$on('toggle', this.toggle);
Run Code Online (Sandbox Code Playgroud)
但我需要,该数据仅在触发组件中更改。
谢谢。
问题:我使用EventBus的greenrobot通过一些事件。不幸的是,对于在两个之间fragments不传递数据的情况,它对我有用。因此,该事件不会被触发。
问题:我会误解这个概念吗?还是我的代码有错误?
注意:两个片段在发送事件时都存在。一个fragment是父母,另一个是孩子以显示详细信息。
详细片段:
public class DetailFragment extends Fragment {
(...)
refreshButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
EventBus.getDefault().post(new IntentRefresh());
}
});
(...)
}
Run Code Online (Sandbox Code Playgroud)
EventBus类别:
public class IntentRefresh {
public IntentRefresh (){}
public void refreshParent() {
}
}
Run Code Online (Sandbox Code Playgroud)
父片段:
public class ParentFragment extends Fragment {
(...)
@Override
public void onPause() {
super.onPause();
EventBus.getDefault().unregister(this);
}
@Override
public void onResume() {
super.onResume();
EventBus.getDefault().register(this);
}
@Subscribe(threadMode = ThreadMode.MAIN)
public void …Run Code Online (Sandbox Code Playgroud) 我想通过 Vertx 中的 EventBus 同步发送多条消息。我想发送一条消息,等待它,然后再发送下一条消息。地址是一样的。如果是默认的话我该怎么做?还是必须使用executeBlocking代码?
这是我的代码。
public class EventBusSync {
private Vertx vertx = Vertx.vertx();
private static final String SERVICE_ADDRESS = "service.worker";
public void sentViaEvBus() {
String message1 = "message1";
String message2 = "message2";
String reply1 = sendCommand(SERVICE_ADDRESS,message1);
String reply2 = sendCommand(SERVICE_ADDRESS,message2);
}
private String sendCommand(String address, String command) {
String message;
vertx.eventBus().send(address,command, handler -> {
if(handler.succeeded()) {
log.info("success");
} else {
log.error("error",handler.cause());
throw new RuntimeException("ERROR");
}
message = handler.result.body();
});
return message;
}
}
Run Code Online (Sandbox Code Playgroud)
所以在这里,如果发送第一个命令并且发生了一些事情,我想中断下一个事件总线的发送。
谢谢