代码之家  ›  专栏  ›  技术社区  ›  fermoga

如果没有连接,我如何让我的应用程序从本地获取,如果有连接,如何让我的应用程序从远程获取?

  •  0
  • fermoga  · 技术社区  · 6 年前

    我的 MainRepository 是从API获取数据并插入数据库,然后在UI上显示的内容。

    override fun fetchAll() {
        Observable.fromCallable { local.fetchPosts() }
            .doOnNext {
                remote.fetchPosts().concatMap { posts ->
                    local.insert(*posts.toTypedArray())
                    Observable.just(posts)
                }
            }
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(
                { outcome.success(it) },
                { error: Throwable -> outcome.failed(error) }
            ).addTo(compositeDisposable)
    }
    

    这个 outcome 变量是 PublishObject 类型 Response ,即 Loading , Success Failure .

    override val outcome = PublishSubject.create<Response<List<Post>>>()
    
    [...]
    
    sealed class Response<T> {
        companion object {
            fun <T> loading(loading: Boolean): Response<T> = Progress(loading)
            fun <T> success(data: T): Response<T> = Success(data)
            fun <T> failure(e: Throwable): Response<T> = Failure(e)
        }
    
        data class Progress<T>(var loading: Boolean) : Response<T>()
        data class Success<T>(var data: T) : Response<T>()
        data class Failure<T>(var e: Throwable) : Response<T>()
    }
    

    它执行一个方法 local.fetchPosts() ,这是一个负责访问DAO函数的函数。

    fun fetchPosts() = database.postDao().fetchAll()
    
    [...]
    
    @Query("SELECT * FROM posts ORDER BY createdAt DESC")
    fun fetchAll(): List<Post>
    

    addTo Disposable :

    fun Disposable.addTo(compositeDisposable: CompositeDisposable) {
        compositeDisposable.add(this)
    }
    

    我试过用 concatMap 就在那之后 Observable.fromCallable ,但在 doOnNext

    1 回复  |  直到 6 年前
        1
  •  1
  •   Ahmed Ashraf    6 年前

    首先你要明白这一点 doOnNext 是一个 Side Effect Operator

    所以,你在做可观察的

    remote.fetchPosts().concatMap { posts ->
                local.insert(*posts.toTypedArray())
                Observable.just(posts)
            }
    

    从来没有工作,因为它没有被订阅。

    • 尝试从API获取数据。

    • 显示它

    这样就行了:

    remote.fetchPosts()
        // cache the data from remote.
        .doOnNext(posts -> local.insert(*posts.toTypedArray()))
        // if an error happens, use the posts in the DAO.
        .onErrorResumeNext { Observable.fromCallable { local.fetchPosts() } }
        .subscribeOn(Schedulers.io())
        .observeOn(AndroidSchedulers.mainThread())
        [...]