2017-02-09 5 views
3

Gibt es eine Scheduler API in RxJava auch auf AndroidSchedulers.mainThread() in RxAndroid. Also, wenn ich eine Aufgabe auf einen neuen Thread planen und ich möchte es auf Java Main Thread beobachten, wie würde ich das tun?Was ist die Alternative zu AndroidSchedulers.mainThread() in RxJava?

bearbeiten Unten ist ein Beispiel RxSubscription, mit kommentierten System.in, der Haupt-Thread getötet wird, während die Observable.interval auf einem separaten Thread ausgeführt wird. In Android kann ich sagen, observeOn (AndroidSchedulers.MainThread) und jede Operation danach würde auf dem Hauptthread laufen. Ich suche nach einem ähnlichen Scheduler in Java, da AndroidSchedulers Teil von RxAndroid ist.

import java.io.IOException; 
import java.util.concurrent.TimeUnit; 
import rx.Observable; 

public class Main { 

public static void main(String[] args) throws InterruptedException, IOException { 

    Observable<Long> values = Observable.interval(1000, TimeUnit.MILLISECONDS); 
    values.subscribe(
      v -> System.out.println("Received: " + v), 
      e -> System.out.println("Error: " + e), 
      () -> System.out.println("Completed") 
    ); 
    //System.in.read(); 
} 
} 
+1

Wäre interessant zu wissen, * warum * Sie das brauchen. Da es nur einen Hauptthread gibt, gibt es nicht viele Optionen. – FWeigl

+0

Warum müssen Sie etwas in einem bestimmten Thread beobachten? in Android hat der Hauptthread eine besondere Bedeutung, was ist Ihre Anforderung? –

+0

@Ascorbin bearbeitet Frage zu erarbeiten –

Antwort

5

Die Rückkehr zum Java-Thread "main" ist derzeit nicht möglich, da es keinen blockierenden Scheduler für RxJava 1.x gibt.

Falls Sie auf RxJava 2.x aktualisieren können, hat ich einen besonderen Scheduler, die "gepinnt", um den aktuellen Thread werden kann:

compile "com.github.akarnokd:rxjava2-extensions:0.15.1" 

BlockingScheduler

Diese Art von Scheduler führt seine Ausführungsschleife auf dem "aktuellen Thread" aus, genauer gesagt dem Thread, der seine execute() -Methode aufgerufen hat. Die Methode blockiert, bis das shutdown() aufgerufen wird. Diese Art von Scheduler ermöglicht die Rückkehr zum "Haupt" -Thread von anderen Threads.

public static void main(String[] args) { 
    BlockingScheduler scheduler = new BlockingScheduler(); 

    scheduler.execute(() -> { 
     Flowable.range(1, 10) 
      .subscribeOn(Schedulers.io()) 
      .observeOn(scheduler) 
      .doAfterTerminate(() -> scheduler.shutdown()) 
      .subscribe(v -> System.out.println(v + " on " + Thread.currentThread())); 
    }); 

    System.out.println("BlockingScheduler finished"); 
} 
0

Ja, RxJava hat Scheduler. Um eine Nachricht an einen beliebigen Thread zu senden, müssen Sie eine Nachrichtenschleife haben, die auf Nachrichten von den anderen Threads wartet. In Android ist dies Ihr Looper. In Java müssten Sie das selbst tun. Ihr Scheduler würde dann eine Nachricht an diesen Thread senden und die Arbeit in dieser Nachrichtenantwort ausführen. Der Mechanismus dafür hängt davon ab, wie Sie Ihre Nachrichtenwarteschlange implementieren, sollte aber ziemlich trivial sein.

Verwandte Themen