Несколько действий, реализующих один и тот же слушатель - PullRequest
0 голосов
/ 25 июня 2018

Я знаю, что есть похожие вопросы, но он все еще не отвечает на мой вопрос так, как мне нужно в моей текущей ситуации.

У меня есть три докладчика активности, каждый из которых должен вызывать определенные данные удаленно, поэтому при поступлении данных будет вызываться докладчик активности. Для создания этого прослушивателя данных я создал интерфейсный прослушиватель, и, поскольку все три докладчика запрашивают одни и те же данные и извлекают их, все три докладчика реализуют этот прослушиватель интерфейса.

Интерфейсный слушатель:

interface ListenerInterface {

     onGotData();

}

Ведущий один:

class PresenterOne implements ListenerInterface{

    public void getData() {
        DataManager dataManager = new DataManager();
        dataManager.getData(this);
    }

    @Override
    public void onGotData(Data data) {
        //Do something with data
    }
}

Ведущий два очень похож на ведущего:

class PresenterTwo implements ListenerInterface{

    public void getData() {
        DataManager dataManager = new DataManager();
        dataManager.getData(this);
    }

    @Override
    public void onGotData(Data data) {
        //Do something with data
    }
}

Предположим, что Presenter Three точно такой же, как и предыдущий. Класс менеджера данных:

class DataManager {

    public void getData(final ListenerInterface listener) {

        //Gets data
        addOnCompleteListener(new OnCompleteListener<Data data > () {
            @Override
            public void onComplete (@NonNull DataCall < Data > dataCall) {
                listener.onGotData(dataCall.getResults());
            }

        });
    }
}

Будет ли при этом кто-нибудь вызывать всех трех докладчиков, поскольку интерфейс выполняет вызов, или будет вызывать только переданного докладчика? Есть ли что-то, о чем мне стоит беспокоиться, если я пойду по пути? Если кто-то, кто хорошо знает платформу Android, мог бы дать подробный ответ, чтобы я мог узнать из него больше, это было бы здорово. Причина, по которой я хочу это сделать, заключается в том, что я хочу общаться через интерфейсы между классами.

Извините, если этот вопрос прост для некоторых людей, но я все еще учусь.

Заранее большое спасибо.

1 Ответ

0 голосов
/ 25 июня 2018

вы можете использовать реализацию RxBus для создания глобального события (например, вашего onGotData).Сначала вы должны создать класс RxBus.

public class RxBus {
private static RxBus instance;
private PublishSubject<Event> subject = PublishSubject.create();

public static synchronized RxBus getInstance() {
    if (instance == null) {
        instance = new RxBus();
    }

    return instance;
}

private RxBus(){}

public void postEvent(Event event){
    subject.onNext(event);
}

public Observable<Event> getEvents(){
    return subject;
}

}

А теперь вы должны подписаться на него в BaseActivity или что-то в этом роде (зависит от структуры вашего проекта).

private RxBus rxbus;
private Subscription rxBusSubscription;

@Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        rxBus = RxBus.getInstance();
    }

@Override
protected void onResume() {
    super.onResume();

    if (shouldSubscribeRxBus()) {
        rxBusSubscription = rxBus.getEvents()
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(event -> {
                    if (event.getEventType() == Event.EventType.DATA_RECEIVED) {
                        onGotData(data);
                    }
                });
    }
}

Теперь реализуйте ваши onGotData так, как вы хотите.

Когда вы перехватываете данные, полученные вызовом:

class DataManager {

public void getData(final ListenerInterface listener) {

    //Gets data
    addOnCompleteListener(new OnCompleteListener<Data data > () {
        @Override
        public void onComplete (@NonNull DataCall < Data > dataCall) {
            RxBus.getInstance().postEvent(new GotDataEvent(dataCall.getResults()));
        }

    });
}
}

Вы можете создать свою структуру классов событий как хотите.

...