KrzysztofB
KrzysztofB

Reputation: 101

RxAndroid called from main thread

I have this issue ;)

I'm trying to call this usecase, which at the end returns an Observable.

But, despite using schedulers, constantly is being invoked on the main thread. I don't know why:

It looks like this:

class MainViewModel @Inject constructor(private val loadNewsUseCase: LoadNews) : Model {

    override fun loadNews() {
        loadNewsUseCase.execute(NewsObserver(), "")
    }

    override fun dispose() {
        loadNewsUseCase.dispose()
    }
}

class NewsObserver : DisposableObserver<Result>() {
    override fun onComplete() {
        Log.i("TAG", "")
    }

    override fun onNext(t: Result) {
        Log.i("TAG", "")

    }

    override fun onError(e: Throwable) {
        Log.i("TAG", "")

    }
}

-

abstract class UseCase<T, in P>(
        private val computationThreadExecutor: ComputationThreadExecutor,
        private val mainThreadExecutor: MainThreadExecutor,
        private val compositeDisposable: CompositeDisposable = CompositeDisposable()
) {

    abstract fun createUseCase(params: P): Observable<T>

    fun execute(disposableObserver: DisposableObserver<T>, params: P) {
        requireNotNull(disposableObserver)

        val observable = createUseCase(params)
                .subscribeOn(Schedulers.newThread())
                .observeOn(mainThreadExecutor.getThread())

        val disposable = observable.subscribeWith(disposableObserver)

        addDisposable(disposable)
    }

    private fun addDisposable(disposable: Disposable) {
        requireNotNull(disposable)
        compositeDisposable.add(disposable)
    }

    fun dispose() {
        !compositeDisposable.isDisposed.apply { compositeDisposable.dispose() }
    }
}

UseCase concrete implementation uses DataService to fetch data from api, which looks like this:

open class NewsDataService(private val newsDataProvider: NewsDataProvider) : NewsService {

    override fun loadNews(): Observable<Result> {

         return Observable.just(newsDataProvider.fetchData())

    }
}

Inside NewsDataProvider is normal sync retrofit call.

Problem is, that from every begininning useCase is invoked in the mainThread(). Shouldn't be called in a new thread?

Upvotes: 1

Views: 529

Answers (2)

John O&#39;Reilly
John O&#39;Reilly

Reputation: 10330

Make fetchData return an Observable<Result> (or potentially Single but that would require wider updates in your code). Retrofit supports RxJava.

Upvotes: 1

laalto
laalto

Reputation: 152817

Replace

Observable.just(foo)

with something like

Observable.fromCallable(() -> foo)

Observable.just() creates an observable from the supplied values and you're computing the value on the main thread. fromCallable() takes in a callback that can be invoked on your subscription thread.

Upvotes: 5

Related Questions