Otto - 在同一个 Fragment/Activity 中订阅多个事件

Otto - subscribe multiple events in the same Fragment/Activity

我正在使用 Otto 的 Retrofit。 我的问题是如何在同一个片段(或Activity)中订阅多个事件。根据official doc"The method should take only a single parameter, the type of which will be the event you wish to subscribe to."

不能@Subscribe public void getAllData(Event1 event1, Event2 event2);

另外我不能订阅两次,比如:@Subscribe public void getDataOne(Event1 event1);@Subscribe public void getDataTwo(Event2 event2);在同一个片段中(或Activity)class.

在我的片段class中我注册和注销了总线:

@Override
public void onAttach(Activity activity) {
    super.onAttach(activity);
    BusProvider.getInstanceBus().register(this);
}

@Override
public void onDetach() {
    super.onDetach();
    BusProvider.getInstanceBus().unregister(this);
}

使用通用 class:

  public class BusProvider {
    private static final Bus BUS = new Bus();

    public static Bus getInstanceBus(){
        return BUS;
    }

    private BusProvider(){}
}

我 post 我的事件来自 success() 我的改造请求方法:

 @Override
        public void success(DataResponseOne dataResponseOne, Response response) {
            Log.d(GeneralConstants.LOG_TAG, " !SUCCES!");

            //sent data to otto bus
            BusProvider.getInstanceBus().post(dataResponseOne);

[some code for to get json in string]

            Log.d(GeneralConstants.LOG_TAG + "  !SUCCES!" + resultJSON );
        }

第二个事件也一样:

    @Override
        public void success(DataResponseTwo dataResponseTwo, Response response) {
            Log.d(GeneralConstants.LOG_TAG, " !SUCCES!");

            //sent data to otto bus
            BusProvider.getInstanceBus().post(dataResponseTwo);

[some code for to get json in string]

            Log.d(GeneralConstants.LOG_TAG + "  !SUCCES!" + resultJSON );
        }

我想我错过了一些棘手的事情。任何建议将不胜感激。

您可以让两个数据响应都扩展相同的基础 class,您的订阅者将其作为参数。然后,您可以使用 instanceOf 来查看它是 Event1 还是 Event2.

实际上,我的图书馆已从 Otto 更改为 EventBus(com.google.common.eventbus)。在这里,这不再是什么大问题了,我 可以使用相同的方式在同一个 Fragment/Activity 中订阅多个事件 。不管怎样,我会在这里放一些代码给有同样问题的初学者。

所以,首先我们需要将库声明为gradle:

compile group: 'com.google.guava', name: 'guava', version: '15.0'

然后为所有项目创建一个通用的 class,带有 EventBus 实例:

public class EventBusGenerics {

        private static EventBus 

EVENTBUS = new EventBus();

public static EventBus getInstanceEventBus() {
    return EVENTBUS;
}

private EventBusGenerics() {
    }
}

Post你的活动上车了:

(第一个)

@Override
        public void success(DataResponseOne dataResponseOne, Response response) {
            Log.d(GeneralConstants.LOG_TAG, " !SUCCES!");

            //sent data to otto bus
            BusProvider.getInstanceBus().post(dataResponseOne);

[some code for to get json in string]

            Log.d(GeneralConstants.LOG_TAG + "  !SUCCES!" + resultJSON );
        }

(第二个)

@Override
        public void success(DataResponseTwo dataResponseTwo, Response response) {
            Log.d(GeneralConstants.LOG_TAG, " !SUCCES!");

            //sent data to otto bus
            BusProvider.getInstanceBus().post(dataResponseOne);

[some code for to get json in string]

            Log.d(GeneralConstants.LOG_TAG + "  !SUCCES!" + resultJSON );
        }

注册和取消注册 Fragment/Activity 我们需要此事件的地方:

(这里是片段)

@Override
public void onAttach(Activity activity) {
    super.onAttach(activity);
    BusProvider.getInstanceBus().register(this);
}

@Override
public void onDetach() {
    super.onDetach();
    BusProvider.getInstanceBus().unregister(this);
}

并订阅事件,两者:

@Subscribe
    public void onSubscribeLoginResponse(DataResponseOne dOne) {
[code to use the event...]
}

@Subscribe
    public void onSubscribeLoginResponse(DataResponseTwo dTwo) {
[code to use the event...]
}