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...]
}
我正在使用 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...]
}