In Android applications, some (many?) operations tend to be executed asynchronously. Consider the following code:
// in some activity
fun handleClick() {
mObservable
.subscribeOn(AndroidSchedulers.mainThread())
.subscribe({
toast("Operation finished")
}, {
Log.e("tag", it)
})
mManager.doAsyncWork()
}
The intent is to initiate some possibly long running work and later notify user that work is completed. doAsyncWork
would (possibly indirectly) at some point emit a new item which signals completion on work.
However, there is a bug here.
If doAsyncWork
is fast enough, new item will be emitted before subscription is actually connected to observable and so the subscriber code will never receive the item.
Calling subscribeOn(AndroidSchedulers.mainThread())
apparently changes the process of connecting even though it might seem nothing should happen as the code is already executing on the main thread.