Otto - 在同一片段/活动中订阅多个事件

时间:2015-06-29 12:31:58

标签: android retrofit otto

我正在使用Otto的Retrofit。 我的问题是如何订阅同一片段(或活动)中的多个事件。根据{{​​3}} "该方法应该只采用一个参数,其类型将是您要订阅的事件。"

无法执行@Subscribe public void getAllData(Event1 event1, Event2 event2);

此外,我无法订阅两次,例如:同一片段(或活动)类中的@Subscribe public void getDataOne(Event1 event1);@Subscribe public void getDataTwo(Event2 event2);

在我的Fragment类中,我注册并取消注册总线:

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

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

使用泛型类:

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

    public static Bus getInstanceBus(){
        return BUS;
    }

    private BusProvider(){}
}

我从我的改装请求的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 );
        }

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

2 个答案:

答案 0 :(得分:2)

实际上我的库已从.toMatch(RegExp)更改为expect(row.getText()).toMatch(/H[aå]kan [AÅ]str[oö]m/) (com.google.common.eventbus)。这里不再是一个大问题,我可以使用相同的方式在相同的片段/活动中订阅多个事件。无论如何,我会在这里为那些有同样问题的初学者提供一些代码。

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

Otto

然后使用EventBus实例为所有项目创建一个泛型类:

EventBus

将您的活动发布到巴士:

(第一个)

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

(第二个)

public class EventBusGenerics {

        private static EventBus 

EVENTBUS = new EventBus();

public static EventBus getInstanceEventBus() {
    return EVENTBUS;
}

private EventBusGenerics() {
    }
}

注册并取消注册我们需要此事件的片段/活动:

(这里是片段)

@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 );
        }

答案 1 :(得分:0)

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