Я пытался найти элегантный способ сделать это, но пока не смог. Было несколько раз, когда я хотел создать шаблон дизайна для этого, но никогда не нашел ничего достаточного.
Вот пример использования. В Android вы можете получить обновления GPS-местоположения. Хранение GPS по-прежнему дорого. Это дорого стоить GPS, особенно если вы ничего не делаете с обновлениями местоположения. Я хотел бы иметь тему/наблюдение, которая может иметь несколько подписей, что когда она получает 1 подписку, она получает и удерживает GPS и начинает потоковое обновление местоположения. Когда все подписки отписаны, он отключает GPS.
Что было бы хорошей моделью для выполнения этого общего поведения?
Возможно, вы сможете использовать оператор 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/0.
Таким образом, ваш прокси отслеживает количество раз, когда оно было открыто. (все открытые соединения с ним). если значение ref равно 0, тогда он отключается GPS.
Это означает, что у вас не может быть истинного прокси-сервера, поскольку конечный пользователь должен будет вызвать open/close. не используйте финализацию для этого, так как это может привести к непредвиденным последствиям. (не доверяйте сборщику мусора для синхронизации вашего контрольного счетчика).
Если вы просто используете интерфейс GPS (не можете расширять его с помощью open/close/addRef/removeRef), вы также можете угадать его, и каждый прокси-сервер будет хранить таймер "lastAccessed", который, когда истек, закрывает/отменяет его счетчик ссылок и при активации снова увеличивается количество ссылок). Однако это всегда будет проблемой (иногда ваш код будет ошибочно предполагать, что он не используется)
во всяком случае, шаблон, который будет использоваться, был бы подозрительным.