RxAndroid从主线程调用

时间:2018-02-18 17:41:21

标签: android rx-java rx-java2 rx-android

我有这个问题;)

我试图调用这个用例,最后返回一个Observable。

但是,尽管使用调度程序,仍然在主线程上调用。我不知道为什么:

看起来像这样:

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具体实现使用DataService从api获取数据,如下所示:

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

    override fun loadNews(): Observable<Result> {

         return Observable.just(newsDataProvider.fetchData())

    }
}

Inside NewsDataProvider是普通的同步改装电话。

问题是,在每个begininning中都会在mainThread()中调用useCase。不应该在新线程中调用吗?

2 个答案:

答案 0 :(得分:5)

替换

Observable.just(foo)

类似

Observable.fromCallable(() -> foo)

Observable.just()从提供的值中创建一个observable,然后您计算主线程上的值。 fromCallable()接受可以在订阅线程上调用的回调。

答案 1 :(得分:1)

fetchData返回Observable<Result>(或可能Single,但这需要您的代码更广泛的更新)。 Retrofit支持RxJava