我有这个问题;)
我试图调用这个用例,最后返回一个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。不应该在新线程中调用吗?
答案 0 :(得分:5)
替换
Observable.just(foo)
类似
Observable.fromCallable(() -> foo)
Observable.just()
从提供的值中创建一个observable,然后您计算主线程上的值。 fromCallable()
接受可以在订阅线程上调用的回调。
答案 1 :(得分:1)
让fetchData
返回Observable<Result>
(或可能Single
,但这需要您的代码更广泛的更新)。 Retrofit
支持RxJava
。