2017-12-15 11 views
0

Ich wickle etwas Async-Code mit Observable.create(...). Der Async-Code muss fünf Sekunden lang "aktiv" sein und dann sollte er gestoppt werden. Dies ist, wie ich zur Zeit bin es zu stoppen:RxJava 2: Observable.create() warte, bis der Async-Code mit Thread.sleep() fertig ist

Observable.<MyObject>create(emitter -> { 

    // Some async code 

    emitter.setDisposable(Disposables.fromRunnable(() -> { 
     // Stop the above async code 
    })); 

    // Wait for 5 seconds until the async code above has had enough time to finish its task. 
    Thread.sleep(5000); 

    if (!emitter.isDisposed()) { 
     // Stop the above async code 
     emitter.setDisposable(null); 
    } 
})... 

Ich bin nicht sicher, ob dies der beste Weg ist, weil Thread.sleep(5000) verwendet wird. Gibt es einen besseren Weg, dies mit etwas RxJava-Code zu tun?

+1

Was ist dieser asynchrone Code? Kann es nicht signalisieren, ob es alleine abgeschlossen wurde? Es gibt eine zeitlich begrenzte 'take()' Überladung, die eine Quelle stoppen kann, aber Sie müssen immer noch 'setDisposable' in' create' haben. – akarnokd

+0

@akarnokd Der Async-Code ist die Netzwerkdienst-Erkennung von Android (https://developer.android.com/training/connect-devices-wireless/nsd.html#discover). Es sucht nach Geräten im lokalen Netzwerk, bis der Listener nicht registriert ist. Ich möchte nur einmal scannen, also muss ich den Hörer nach fünf Sekunden manuell abmelden und dann 'emitter.onComplete()' aufrufen. Vervollständigt und entsorgt "take()" das Observable? –

+0

Schauen Sie sich das Javadoc und das Diagramm an: [take()] (http://reactivex.io/RxJava/2.x/javadoc/io/reactivex/Observable.html#take-long-java.util.concurrent. TimeUnit-). – akarnokd

Antwort

1

Es gibt eine zeitliche Überlastung von take, die Sie Elemente aus einer Quelle, bis die vorgegebene Zeit abgelaufen haben können:

Observable.<MyObject>create(emitter -> { 

    // Some async code 

    emitter.setDisposable(Disposables.fromRunnable(() -> { 
     // Stop the above async code 
    })); 
}) 
.take(5, TimeUnit.SECONDS); 

Sie noch haben die Einrichtung des Disposable in create.

Verwandte Themen