С AsyncTask вы в основном выполняете асинхронную операцию в рабочем потоке, а затем используете ее результат в основном потоке. В Rx вы бы использовали что-то вроде следующего:
Observable.fromCallable(asyncOperation)
.subscribeOn(backgroundThread)
.observeOn(mainThread)
.subscribe(result -> { /* update UI for instance */ })
Кажется, вы также заинтересованы в onNext
, onError
и onComplete
.
onNext
вызывается каждый раз, когда наблюдаемое излучает предмет. Каждый раз, когда он вызывается, он получает элемент и затем может его обработать. onError
вызывается, когда наблюдаемое обнаружило ошибку по какой-либо причине. Когда он вызывается, он получает Throwable, который представляет причину ошибки. после вызова onNext и onComplete не вызываются. onComplete
вызывается после вызова onNext с последним элементом. Он не получает никаких входных данных, например, вы можете выполнить некоторую очистку.
Использование вышеуказанных методов выглядит следующим образом:
Observable.fromCallable(asyncOperation)
.subscribeOn(backgroundThread)
.observeOn(mainThread)
.subscribe(onNext, onError, onComplete)
[Редактировать]
Если вы хотите создать свой Observable, используя Observable.create()
, вы определенно можете это сделать, он дает вам более точный контроль над тем, что и когда вы излучаете через Observable. Это можно сделать, например, если вы хотите обработать некоторые конкретные c ошибки, которые могут возникнуть в результате вашего сетевого запроса, и выдать различные Throwable
s в зависимости от ошибки.
ObservableOnSubscribe asyncOperation = new Observable.OnSubscribe<Integer>() {
@Override
public void call(Subscriber<? super Integer> emitter) {
try {
// network request
// Once result is ready, call emitter.onNext().
// When done, complete this Observable by calling emitter.onComplete()
} catch (Exception e) {
// handle error, and emit it using emitter.onError()
}
}
}