如何解决在 Paging 库 v2 中使用 RxJava 时设置 Espresso 空闲资源
我在使用 Paging 库 v2 和 RxJava 时正在尝试编写 Espresso 测试:
class PageKeyedItemDataSource<T>(
private val schedulerProvider: BaseSchedulerProvider,private val compositeDisposable: CompositeDisposable,private val context : Context
) : PageKeyedDataSource<Int,Character>() {
private var isNext = true
private val isNetworkAvailable: Observable<Boolean> =
Observable.fromCallable { context.isNetworkAvailable() }
override fun fetchItems(page: Int): Observable<PeopleWrapper> =
wrapEspressoIdlingResource {
composeObservable { useCase(query,page) }
}
override fun loadAfter(params: LoadParams<Int>,callback: LoadCallback<Int,Character>) {
if (isNext) {
_networkState.postValue(NetworkState.LOADING)
isNetworkAvailable.flatMap { fetchItems(it,params.key) }
.subscribe({
_networkState.postValue(NetworkState.LOADED)
//clear retry since last request succeeded
retry = null
if (it.next == null) {
isNext = false
}
callback.onResult(it.wrapper,params.key + 1)
}) {
retry = {
loadAfter(params,callback)
}
initError(it)
}.also { compositeDisposable.add(it) }
}
}
override fun loadInitial(
params: LoadInitialParams<Int>,callback: LoadInitialCallback<Int,Character>,) {
_networkState.postValue(NetworkState.LOADING)
isNetworkAvailable.flatMap { fetchItems(it,1) }
.subscribe({
_networkState.postValue(NetworkState.LOADED)
if (it.next == null) {
isNext = false
}
callback.onResult(it.wrapper,null,2)
}) {
retry = {
loadInitial(params,callback)
}
initError(it)
}.also { compositeDisposable.add(it) }
}
}
这是我的wrapEspressoIdlingResource
:
inline fun <T> wrapEspressoIdlingResource(task: () -> Observable<T>): Observable<T> = task()
.doOnSubscribe { EspressoIdlingResource.increment() } // App is busy until further notice
.doFinally { EspressoIdlingResource.decrement() } // Set app as idle.
但它不会等到数据从网络传送过来。当我在传递数据之前使用Thread.Sleep时,Espresso测试会通过,所以这与我的空闲资源设置有关。
我相信这可能与 Paging 库有关,因为当我在其他没有 Paging 库的示例中使用 Observable 类型时,这种方法非常适用。
完整源代码位于:https://github.com/Ali-Rezaei/StarWarsSearch-Paging
我错过了什么?
解决方法
我需要覆盖构建器上的 fetchDispatcher :
class BasePageKeyRepository<T>(
private val scheduler: BaseSchedulerProvider,) : PageKeyRepository<T> {
@MainThread
override fun getItems(): Listing<T> {
val sourceFactory = getSourceFactory()
val rxPagedList = RxPagedListBuilder(sourceFactory,PAGE_SIZE)
.setFetchScheduler(scheduler.io()).buildObservable()
...
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。