2015-06-29 4 views
-1

Я пользуюсь Retrofit с Otto. Моя проблема заключается в том, как подписаться на несколько событий в том же фрагменте (или Activity). Согласно official doc«Метод должен принимать только один параметр, тип которого будет событием, на которое вы хотите подписаться».:Otto - подписаться на несколько мероприятий в том же фрагменте/активность

I не может сделать @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

На самом деле мне была изменена моя библиотека от Otto до EventBus (com.google.common.eventbus). Здесь это больше не имеет большого значения, I может подписаться на несколько событий в том же фрагменте/мероприятии, используя тот же самый способ. Во всяком случае, я приведу здесь код для начинающих, у кого такая же проблема.

Итак, сначала нам нужно объявить библиотеку в 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/Деятельность, где нам нужно это событие:

(здесь для фрагмента)

@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...] 
} 
0

Вы можете иметь оба ответа на данные, чтобы расширить тот же базовый класс, который ваш абонент принимает в качестве параметра. Затем вы можете использовать instanceOf, чтобы узнать, является ли оно Event1 или Event2.

+0

thx для вашего времени, но я нашел более легкое решение – Choletski