Android RxJava/Kotlin - 将大量数据映射到网络调用

Android RxJava/Kotlin - map large set of data to network calls

我正在尝试实现一个 Android 应用程序,它需要从后端服务获取大量数据并将其保存到数据库以供以后处理。

下面的代码描述了这个过程:

itemsService
    .getAllItemIds() //This returns Single<List<Int>> from backend
    .subscribeOn(Schedulers.io())
    .subscribe({
        Observable.fromIterable(it)
        .map({
            itemsService
            .getItemById(it) //This gets one item details from backend
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe({
                //Add item details to db
            }, {
                //Some error
            })
        })
    }, {
        //Some error
    })

我获得了一个 ID 列表,然后将这些 ID 中的每一个映射到网络调用以获取完整的对象。

这适用于包含 10 个项目的测试集,但生产集包含超过 50 000 个 ID。它最初可以运行,保存项目,但大约 5-10% 时它会停止运行并且应用程序会死掉。

我假设这里的原因是 Rx 保持源和映射值之间的引用。

我的问题是:有没有办法 "pool" 源排放量一次达到 10 个?或者可能还有其他一些我不知道的机制?

你没有提到 "grinds to a halt" 的确切含义,但在 50,000 个项目的实际情况下你会内存不足是有道理的,因为你基本上会尝试一次创建 50,000 个线程来获取每个项目的详细信息。

此外,您不是使用运算符链接 Observable,而是在 subscribe/map 处创建嵌套链,您可以阅读 为什么不应该t.

关于一次将工作限制为 10 个,有一个 flatMap 过载,最后它可能看起来像这样:

itemsService
    .getAllItemIds() //This returns List<Int> from backend
    .flatMapIterable { t -> t }
    .flatMap({
        itemsService
                .getItemById(it) //This gets one item details from backend
                .subscribeOn(Schedulers.io())
    }, 10) //limit flat map parallelism by desired value 
    .subscribeOn(Schedulers.io())
    .observeOn(AndroidSchedulers.mainThread())
    .subscribe({
        //Add item details to db
    }, {
        //Some error
    })