2017-02-20 33 views
0

В Reactive Java нам сказали, что вызов .subscribe() возвращает «ссылку на подписку». Но Subscription - это интерфейс, а не класс. Итак, какой объект мы передаем, который реализует этот интерфейс? У нас есть какой-то контроль над этим?Какой объект является реактивной подпиской на Java?

Существует класс Subscriptions, который может создавать и возвращать несколько разных видов Subscription, но что с ними делать? Если я пишу

Subscription mSub = Subscriptions.create(<some Action0>); 
mSub = someObservable.subscribe(); 

не будет мой только что созданный Subscription просто переписываются любыми возвращает .subscribe() вызовов? Как вы используете созданный вами Subscription?

(На несколько связанной ноте, что точка Subscriptions.unsubscribed(), которая «возвращает подписку, в которой отписать ничего не делает, так как это уже отписался. А?)

ответ

2

Короткий ответ: Вы не должны заботиться.

Более длинный ответ: подписка дает вам два метода:

  • unsubscribe(), что вызывает подписка прекратить.
  • isUnsubscribed(), который проверяет, произошло ли это.

Вы можете использовать эти методы для а) проверки, прекращена ли цепочка Observable, и b) вызвать ее преждевременное завершение, например, если пользователь переключился на другое действие.

Все. Вы не подвергаетесь внутренним воздействиям с целью. Кроме того, вы заметили, что нет метода resubscribe? Это связано с тем, что если вы хотите перезапустить операцию, вам необходимо повторно отправить подписку на Observable, предоставив вам новую подписку.

1

Как вы знаете Subscription s используются для сохраняйте ссылки на текущие Observable, в основном для управления ресурсами. Например, в приложениях для Android, когда вы меняете Activity (экран), вы сбрасываете старые ActivityObservable. В этом случае Subscription экземпляров приведены в .subscribe() (как вы упомянули) и Таким образом, по какой причине можно было бы создать Subscription напрямую, особенно Subscriptions.unsubscribed() ? Я столкнулся с двумя случаями:

  • По умолчанию; избегайте объявления вроде Subscription mSub;, которое будет заполнено последним и может создать NPE. Это особенно верно, если вы используете Kotlin, для которого требуется инициализация свойств.

  • Тестирование

+0

Спасибо. Вопросы: хранит ли подписка на активность Android каким-то образом позволяет повторно подключиться к наблюдаемому при перезапуске Activity? Можете ли вы привести пример? Как использовать созданную подписку в реализации по умолчанию? Я объявил некоторые Подписки (для RxAndroidBle) в приложении для Android, и это, похоже, не вызывает проблемы. –

+0

Основное использование ссылки 'Subscription' - это вызов' .dispose() 'на нем. Поэтому, если вы не обрабатываете отмену подписки, просто отпустите ссылку «Подписка», напишите 'myObservable.subscribe();', не присваивая ее переменной. Типичным использованием является подписка на 'onResume()' метод, хранение 'Subscription' и in' onPause()' для вызова 'subscription.dispose();' –

0

На несколько связанной ноте, что точка Subscriptions.unsubscribed(), который «возвращает Подписка на которой отписать ничего не делает, так как это уже отписался. А?

В 1 ,x, Subscriptions.unsubscribed() используется для возврата экземпляра Subscription, когда операция была завершена (или никогда не запускается в первую очередь), когда элемент управления возвращается в ваш код из RxJava. Поскольку отказ от подписки является апатридом и постоянным состоянием, возвращенный Subscription является синглом, потому что, просто взглянув на интерфейс Subscription, нет (разумного) способа отличить один завершенный/unsubscribed Subscription от другого.

В 2.x имеется общедоступная и внутренняя версия его эквивалентного интерфейса, Disposable. Внутренняя версия используется в основном для замены живого Disposable с завершенным, избегая NullPointerException и нулевых проверок в целом и помогая GC.

Что с ними делать?

Обычно вам не нужно беспокоиться о Subscriptions.create(); предусмотрено для случая, у вас есть ресурс, который вы хотите присоединить к жизненному циклу вашего конечного абонента:

FileReader file = new FileReader ("file.txt"); 

readLines(file) 
.map(line -> line.length()) 
.reduce(0, (a, b) -> a + b) 
.subscribe(new Subscriber<Integer>() { 
    { 
     add(Subscriptions.create(() -> { 
      Closeables.closeSilently(file); // utility from Guava 
     }); 
    } 
    @Override public void onNext(Integer) { 
     // process 
    } 
    // onError(), onCompleted() 
}); 

Этот пример, демонстрирует один из способов использования, могут быть выражены через using вместо, тем не менее:

Observable.using(
    () -> new FileReader("file.txt"), // + try { } catch { } 
    file -> readLines(file).map(...).reduce(...), 
    file -> Closeables.closeSilently(file) 
) 
.subscribe(...) 

 Смежные вопросы

  • Нет связанных вопросов^_^