【问题标题】:How to return Observable from subscribe or map?如何从订阅或地图返回 Observable?
【发布时间】:2019-05-05 19:08:00
【问题描述】:

我想在Subscribe函数中返回Observable,但是看了文档说不可能。 所以我尝试通过使用地图功能来做到这一点。但是,它产生了错误。

这是代码:

interface DataSource {

    fun getItem() : Observable<List<RetroCrypto>>
}

//

object RemoteDataSource : DataSource {

private val myCompositeDisposable by lazy { CompositeDisposable() }

override fun getItem() : Observable<List<RetroCrypto>> {

    val retrofit = RetroClient.getRetrofit()
    val requestInterface = retrofit.create(GetData::class.java)

    myCompositeDisposable.add(requestInterface.getData()
        // Send the Observable’s notifications to the main UI thread
        .observeOn(AndroidSchedulers.mainThread())
        // Subscribe to the Observer away from the main UI thread
        .subscribeOn(Schedulers.io())
        .map { return it }

    )
}

}

getRetrofit 是构建改造实例的方法。

我不知道为什么上面的代码会产生错误。

错误是

1. Return is not allowed here

2. Type mismatch. Required : Observable<List<RetroCrypto>> , Found : List<RetroCrypto>

如何修复代码?

【问题讨论】:

  • 您可以使用.flatMap().concatMap() 代替.map()
  • 感谢您的回答!我以前用过 .flatMap() 。但是,仍然生成“此处不允许重新运行”。
  • 这是我之前做的代码。 .flatMap { return Observable.just(it) }

标签: android kotlin rx-java


【解决方案1】:

map 的 lambda 中,您可以在 Observable 中找到元素,因此在您的情况下,it 似乎是 List&lt;RetroCrypto&gt;。 如果您想返回Observable,您必须执行以下操作:

object RemoteDataSource : DataSource {

    private val myCompositeDisposable by lazy { CompositeDisposable() }

    override fun getItem(): Observable<List<RetroCrypto>> {

        val retrofit = RetroClient.getRetrofit()
        val requestInterface = retrofit.create(GetData::class.java)

        val observable = requestInterface.getData()
                // Send the Observable’s notifications to the main UI thread
                .observeOn(AndroidSchedulers.mainThread())
                // Subscribe to the Observer away from the main UI thread
                .subscribeOn(Schedulers.io())

        return observable
    }
}

注意:您只有在订阅后才能添加到myCompositeDisposable,因此您必须在此功能之外执行myCompositeDisposable.add

【讨论】:

  • 在这种情况下,我认为 getItem() 方法中不需要observeOn。因为我必须在这个函数之外做 myCompositeDisposable.add,然后定义 observeOn()。对吗??
  • 您可以随心所欲地使用observeOnsubscribeOn。从代码结构的角度来看,最好在 getItem() 函数之外执行此操作
  • 好的。我明白。谢谢!
猜你喜欢
  • 1970-01-01
  • 2017-02-17
  • 2019-03-09
  • 1970-01-01
  • 2017-03-26
  • 1970-01-01
  • 2018-09-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多