2017-01-25 3 views
2

Как создать свой собственный горячий Наблюдаемый с нуля?Как создать свою собственную горячую Наблюдаемую с нуля?

Я хотел бы создать свою собственную функцию, возвращая наблюдаемые, возвращающиеся места:

public static Observable<Location> locationObservable(Context context, String provider, long minTime, float minDistance) { 

Это для Android. Для этих целей рекомендуется использовать Observable.create(), но example shows just passing constant list of integers каждому абоненту, который не является горячим.

Если я что-то еще здесь, например, помню список подписчиков, то как я могу реализовать отмену подписки и многие другие функции?

I.e. абсолютно не идея, что делать внутри Observable.OnSubscribe<Integer>() реализации?

ответ

1

Обычно для создания горячей наблюдаемый вы используете какой-то Subject: PublishSubject, BehaviorSubject и т.д.

Смотрите примеры для BehaviorSubjecthere.

class LocationService { 
    private Subject<Location> subject = BehaviorSubject.create(); 

    Observable<Location> locationObservable(...) { 
     return subject; 
    } 

    void onNewLocationListener(Location newLocation) { 
     subject.onNext(newLocation); 
    } 
} 
+0

Но тема записи включена, т.е. любой может разместить дополнительные места для него. Как этого избежать? – Dims

+0

@Dims Вот почему он объявлен 'private'. И когда я возвращаю его, я бросаю его в «Наблюдаемый». –

+0

Это приложение не препятствует доступу к функциям подкласса ... – Dims

0

Посмотрите на этот прекрасный пример взят непосредственно из Realm-х RealmObservableFactory:

@Override 
public Observable<Realm> from(Realm realm) { 
    final RealmConfiguration realmConfig = realm.getConfiguration(); 
    return Observable.create(new Observable.OnSubscribe<Realm>() { // create new observable 
     @Override 
     public void call(final Subscriber<? super Realm> subscriber) { // this is executed on `subscribeOn(Scheduler)` 
      final Realm observableRealm = Realm.getInstance(realmConfig); 
      final RealmChangeListener<Realm> listener = new RealmChangeListener<Realm>() { 
       @Override 
       public void onChange(Realm realm) { 
        if (!subscriber.isUnsubscribed()) { // always check if subscriber is unsubscribed! 
         subscriber.onNext(observableRealm); 
        } 
       } 
      }; 
      subscriber.add(Subscriptions.create(new Action0() { // add unsubscription first! thread specified by unsubscribeOn(Scheduler) 
       @Override 
       public void call() { 
        observableRealm.removeChangeListener(listener); // remove listener 
        observableRealm.close(); 
       } 
      })); 
      observableRealm.addChangeListener(listener); // add listener 
      subscriber.onNext(observableRealm); // initial value 
     } 
    }); 
} 

И читать комментарии, это очень хороший пример.

+0

Можно ли отказаться от подписки на это блюдо? – Dims

+0

А, наверное, еще не читал ... – Dims

+0

Это не * горячий *. Он вызывает «Realm.getInstance()» для каждого нового абонента. –

1

Не рекомендуется писать свои собственные, по крайней мере, до тех пор, пока вы не овладеете существующими и не потребуете своеобразного шаблона кэширования/излучения, не охватываемого стандартными 5 (Async, Behavior, Publish, Replay, Unicast).

У меня есть 3 части серии по этому вопросу (каламбур), если вы действительно хотите:

+0

Я тоже не хочу писать. Я хотел бы «создать», т. Е. Создать экземпляр. Как это сделать? – Dims

+0

http://reactivex.io/RxJava/1.x/javadoc/rx/subjects/PublishSubject.html ищите примерный раздел в Javadoc объектов. – akarnokd

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

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