2015-03-20 3 views
10

Ich habe Aufgabe wie folgt aus:Warum wird das Abonnement nicht in einem neuen Thread ausgeführt?

Observable.just(getMessagesFromDb()). 
    subscribeOn(Schedulers.newThread()). 
    observeOn(AndroidSchedulers.mainThread()). 
    subscribe(incomingMessages -> { 
    //do something 
    }); 

wo getMessagesFromDb Methode ist synchron Nachrichten bekommen, ohne innerhalb Multithreading. Nach Angaben der RxAndroid Dokumentation für subscribeOn Methode:

Asynchron abonnieren Beobachter auf diese Observable auf dem Scheduler angegeben

Und es ist meine Frage - warum die Datenbankabfrage auf Haupt-Thread ausgeführt wird? Wie man es asynchron macht?

+1

Ich glaube nicht, dass ich jemals gesehen habe Methode Chaining mit dem Punkt am Ende vor. –

Antwort

26

Was sehen Sie unten ist eine leicht modifizierte Version des Codes mit getMessagesFromDb() genannt einen Rückgabewert einer Variablen zuzuweisen:

Object data = getMessagesFromDb(); 
Observable.just(data). 
    subscribeOn(Schedulers.newThread()). 
    observeOn(AndroidSchedulers.mainThread()). 
    subscribe(incomingMessages -> { 
     //do something 
    }); 

Es ist genau, wie Observable.just Werke und getMessagesFromDb() in der Tat in dem Haupt-Thread aufgerufen wird (wie Sie es im Hauptthread nennen).

Sie haben es Observable.fromCallable Verfahren aufzuschieben wie folgt verwendet:

Observable.fromCallable(() -> getMessageFromDb()). 
      subscribeOn(Schedulers.newThread()). 
      observeOn(AndroidSchedulers.mainThread()). 
      subscribe(incomingMessages -> { 
       //do something 
      }); 

Bitte beachten Sie, dass Sie Observable.defer statt Observable.fromCallable verwenden können, aber es ist ein wenig komplizierter:

Observable.defer(() -> Observable.just(getMessageFromDb())) 

Die bisherige Version dieser Antwort verwenden Observable.create. Aber es ist kompliziert, mit dieser Methode ein Observable zu erstellen. Versuchen Sie immer bevorzugen Observable.defer oder Observable.fromCallable

+6

Sie können auch: 'Observable.defer (() -> Observable.just (getMessagesFromDb()) subscribeOn (Schedulers.newThread()).)' –

+1

Eine detaillierte und gründliche Erklärung, die mehr als nur für dieses ein Beispiel geholfen. – miroslavign

+1

Dieses Beispiel in der Tat erklärt sehr gut das Konzept und die Verwendung Fall von Zurückstellungs und nur Betreiber. Vielen Dank dafür. – toantran