Ich verwende Retrofit und RxJava, um einige Hintergrundaufgaben auszuführen. Code sieht so aus:
%Vor% Dies schlägt mit RetrofitError aufgrund von NetworkOnMainThread
Exception in dieser Zeile fehl:
Ich abonniere mein Observable:
%Vor% Laut Dokumentation von Rx funktioniert flatMap
nicht mit einem Hintergrund-Thread. Meine Frage ist, wie stelle ich sicher, dass die gesamte getMyData()
Methode im Hintergrund ausgeführt wird.
Ich füge einfach observeOn(Schedulers.newThread())
vor flatMap
hinzu und es funktioniert!
Dies bewegt nur einen Schritt in der Pipeline zum Hintergrund-Thread:
%Vor%Ursprünglich hier beantwortet: Ссылка
Es besteht eine gute Chance, wenn Sie das MyLoader-Objekt im Hauptthread erstellen, das Observable.create ebenfalls ausgeführt wird (oder vielleicht woanders zuvor in Ihrem Code (?)). Wenn dies der Fall ist, hat der .subscribeOn(Schedulers.io())
keine Auswirkung auf das Ändern des Threads.
Sie können versuchen, das .create () mit einem .defer()
zu umbrechen, um sicherzustellen, dass das Observable nur erstellt wird, wenn es abonniert ist.
z.B. defer(() -> create(....))
Tags und Links java android multithreading reactive-programming rx-java