【问题标题】:Convert Observable<List<T>> to List<T>将 Observable<List<T>> 转换为 List<T>
【发布时间】:2019-07-07 10:02:39
【问题描述】:

我想从Observable&lt;List&lt;Country&gt;&gt; 获取MutableLiveData&lt;List&lt;Country&gt;&gt;() 对象,但我找不到方法。

我正在使用下面的实现,但它不起作用。有没有其他方法可以实现它,还是我当前的实现有问题?

dataManagerAnonymous.countries.toList().blockingGet().single()

上面的代码显示NetworkOnMainThreadException并导致应用程序崩溃。

【问题讨论】:

  • 请把你想要的写清楚。首先,您的标题问题和描述问题不一样。在你的标题中你需要 List 而在你的描述中你需要 MutableLiveData>。另外,您在一个帖子中问了两个问题。您的第一个问题与类型转换有关,后者与线程有关,这是完全不同的主题。话虽如此,我相信关于这两个问题有很多问题和答案。建议您在提问之前进行研究。让我们保持社区井井有条

标签: android kotlin rx-java rx-android androidx


【解决方案1】:
dataManagerAnonymous
    .countires
    .subscribeOn(Schedulers.io())
    .observeOn(AndroidSchedulers.mainThread())
    .subscribe { result ->
        // result is List<Country>
    }

dataManagerAnonymous.countires 可能会执行网络请求,应该在后台线程上完成,以防止 UI 线程阻塞。 subscribeOn(Schedulers.io()) 在后台线程上调用您的请求。 observeOn(AndroidSchedulers.mainThread()) 允许您在 UI 线程上使用此调用的结果。当您的请求成功完成并且结果数据准备好处理时,将调用订阅块。

【讨论】:

  • 为什么blockingGet()显示NetworkError,在某些地方它没有显示,而在问题中提到的某些地方,它显示?
  • @miPlodder blockingGet() 阻塞当前线程,直到方法的结果可用。如果你在主线程(用户界面线程)上调用blockingGet(),它会抛出一个错误。您不应该这样做,因为在网络调用的结果到达之前,您的应用程序会被冻结(例如,不会处理单击按钮)。但是,如果您在后台线程上调用blockingGet(),您将不会收到错误消息。阻止后台线程不会使您的应用无响应。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-26
  • 2019-05-20
  • 2012-02-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多