2017-01-25 1 views
2

Wie erstelle ich meine eigene heiße Observable von Grund auf neu?Wie erstelle ich meine eigene heiße Observable von Grund auf neu?

würde Ich mag meine eigene Funktion erstellen, Rückkehr zu beobachten, Rückkehr Standorte:

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

Diese für Android ist. Es wird empfohlen, zu diesem Zweck Observable.create() zu verwenden, aber example shows just passing constant list of integers zu jedem Abonnenten, der nicht heiß ist.

Wenn ich hier etwas anderes mache, zum Beispiel, erinnere mich an eine Liste von Abonnenten, dann, wie werde ich das Abmelden und viele andere Funktionen implementieren?

I.e. absolut keine Idee ist, was in Observable.OnSubscribe<Integer>() Implementierung zu tun? PublishSubject, BehaviorSubject usw.

Beispiele Siehe BehaviorSubjecthere:

Antwort

1

Allgemeinen heiß beobachtbaren Sie verwenden eine Art von Subject zu erstellen.

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

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

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

Aber Thema ist schreib aktiviert, dh jeder kann zusätzliche Standorte hinzufügen. Wie vermeide ich das? – Dims

+0

@Dims Deshalb wird es als "privat" deklariert. Und wenn ich es zurückgebe, werfe ich es auf "Observable". –

+0

Diese Umwandlung verhindert nicht den Zugriff auf die Unterklassenfunktionalität ... – Dims

0

Schauen Sie sich das wunderbare Beispiel direkt aus Realm genommen 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 
     } 
    }); 
} 

Und die Kommentare lesen, es ist ein ziemlich gutes Beispiel.

+0

Wird es möglich sein, sich von diesem Clew abzumelden? – Dims

+0

Ah, habe wahrscheinlich noch nicht genau gelesen ... – Dims

+0

Dieser ist nicht * heiß *. Es ruft 'Realm.getInstance()' für jeden neuen Teilnehmer auf. –

1

Es wird nicht empfohlen, eigene Dateien zu schreiben, zumindest solange, bis Sie die vorhandenen Kenntnisse beherrschen und ein spezielles Caching-/Emissionsmuster benötigen, das nicht von den Standardeinstellungen 5 (Async, Behaviour, Publish, Replay, Unicast) abgedeckt wird.

Ich habe eine 3-Serie über das Thema (Wortspiel beabsichtigt), wenn Sie es wirklich wollen:

+0

Ich möchte nicht auch meine eigene schreiben. Ich möchte "create", also instanziieren. Wie geht das? – Dims

+0

http://reactivex.io/RxJava/1.x/javadoc/rx/subjects/PublishSubject.html Suchen Sie nach dem Beispielabschnitt im Javadoc der Themen. – akarnokd

Verwandte Themen