- What is the difference between them?
Observable.just(someMethodWhichThrowsException())
.subscribeOn(Schedulers.newThread())
This is equivalent to the following:
Object someResult = someMethodWhichThrowsException();
Observable.just(someResult)
.subscribeOn(Schedulers.newThread())
As you can see this makes the synchronous method call first, then passes it to Observable.just
to become an Observable.
Observable.create(new Observable.OnSubscribe() {
@Override
public void call(Subscriber subscriber) {
...
}
})
.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.subscribe();
This method, however, will run the code in the call
block on subscription. You've told it you want to subscribe on a new thread (subscribeOn(Schedulers.newThread())
), so the subscription happens on a new thread, and the code which gets run on subscription (the call
block) gets run on that thread too. This is similar behaviour to calling Observable.defer
.
- What is the best practice while creating async tasks?
Well, that's up to you and your desired behaviour. Sometimes you want the async code to begin running immediately (in which case you may want to cache it using one of the operators for that purpose). I'd definitely consider using the Async Utils library for this.
Other times, you'll want it to run only on subscription (which is the behaviour in the examples here) - for example if there are side-effects, or if you don't care when it's run and just want to use the built-ins to get something off the UI thread. Dan Lew mentions that Observable.defer
is very handy for taking old code and getting it off the UI thread, during a conversion to Rx.
No comments:
Post a Comment