Несколько подписчиков на тему. Включается, когда есть подписки, иначе отключается

1

Я пытался найти элегантный способ сделать это, но пока не смог. Было несколько раз, когда я хотел создать шаблон дизайна для этого, но никогда не нашел ничего достаточного.

Вот пример использования. В Android вы можете получить обновления GPS-местоположения. Хранение GPS по-прежнему дорого. Это дорого стоить GPS, особенно если вы ничего не делаете с обновлениями местоположения. Я хотел бы иметь тему/наблюдение, которая может иметь несколько подписей, что когда она получает 1 подписку, она получает и удерживает GPS и начинает потоковое обновление местоположения. Когда все подписки отписаны, он отключает GPS.

Что было бы хорошей моделью для выполнения этого общего поведения?

  • 1
    Вам известно об операторе refCount ?
  • 0
    @SamuelGruetter может стоить написать ответ, мой слишком общий для этого конкретного случая
Теги:
rx-java

2 ответа

2
Лучший ответ

Возможно, вы сможете использовать оператор share, который по сути является эквивалентом publish().refcount(). Я не тестировал, чтобы убедиться, что он может возобновиться, но код, похоже, указывает, что он может. В принципе, он "подключается", чтобы начать вывод, когда есть один абонент, который поддерживается только одной подпиской. Между тем эта ссылка подсчитывает любые другие дочерние подписчики, и когда она опускается до нуля, она отбрасывает подписку на поддержку. Это означает, что вы можете подключаться к onSubscribe/onUnsubscribe перед вызовом оператора share и делать то, что вам нужно с помощью GPS, или что-то еще, что нужно перекачивать данные. Псевдо-Java впереди:

public class GPSLocationManager {
    private final Observable<Location> locations;

    public GPSLocationManager() {
        locations = getMagicalGPSLocationObservable()
            .doOnSubscribe(() -> turnOnGps())
            .doOnUnsubscribe(() -> turnOffGps())
            .share();
    }

    public Observable<Location> getLocations() {
        return locations;
    }

}

Как я уже сказал, открытый вопросительный знак, похоже, после того, как вы опуститесь до 0, вы можете перезапустить соединение. Я считаю, что ответ "да", но я не уверен.

  • 0
    Это был подход, который я обнаружил, о чем Самуил комментирует выше. Я специально вызывал publish (). RefCount (), и если вы посмотрите на исходный код для share (), это все, что он делает. Спасибо!
0

форма счетчика ссылок может быть им выполнена, как прокси. см. прокси-шаблон

По сути, вы завершаете службу, которую хотите открыть, и открываете/закрываете фактическую службу внутри прокси-сервера, если счетчик ссылок больше 0/0.

Таким образом, ваш прокси отслеживает количество раз, когда оно было открыто. (все открытые соединения с ним). если значение ref равно 0, тогда он отключается GPS.

Это означает, что у вас не может быть истинного прокси-сервера, поскольку конечный пользователь должен будет вызвать open/close. не используйте финализацию для этого, так как это может привести к непредвиденным последствиям. (не доверяйте сборщику мусора для синхронизации вашего контрольного счетчика).

Если вы просто используете интерфейс GPS (не можете расширять его с помощью open/close/addRef/removeRef), вы также можете угадать его, и каждый прокси-сервер будет хранить таймер "lastAccessed", который, когда истек, закрывает/отменяет его счетчик ссылок и при активации снова увеличивается количество ссылок). Однако это всегда будет проблемой (иногда ваш код будет ошибочно предполагать, что он не используется)

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

  • 0
    Так что подсчет ссылок - это хорошо, и все, и обнаружение новых соединений легко, но как мне определить, когда что-то отписалось, и уменьшить счет?
  • 0
    Как я пытался указать, вы не можете обнаружить это. Вы должны либо заставить пользователя вызывать оператор 'close' для вашего объекта, либо угадывать с некоторым таймаутом и таймером, который проверяет, было ли какое-либо действие со времени T.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню