-1

我正在使用 Otto 的改造。我的问题是如何订阅同一个片段(或活动)中的多个事件。根据官方文档 “该方法应该只接受一个参数,其类型将是您希望订阅的事件。”

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

我想我想念一些棘手的问题。任何建议将不胜感激。

4

2 回答 2

2

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

因此,首先我们需要将库声明为 gradle:

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

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

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

在我们需要此事件的地方注册和注销 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...]
}
于 2015-07-08T13:18:18.547 回答
1

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

于 2015-06-29T12:50:40.290 回答