Single.defer() not executed



我有一个问题,我的 Single.defer 块没有被执行。

调用 documentRepository.getDocuments(( 以从 DB 获取文档:

class GetReports
@Inject constructor(
        private val reportRepository: ReportRepository,
        private val documentRepository: DocumentRepository,
        threadExecutor: ThreadExecutor,
        postExecutionThread: PostExecutionThread
) : SingleUseCase<List<Report>, Void?>(
        threadExecutor, postExecutionThread) {
    override fun buildUseCaseObservable(params: Void?): Single<List<Report>> {
        return reportRepository
                .getReports()
                .flatMap { reports ->
                    val finalReports = ArrayList<Report>()
                    reports.forEach { report ->
                        documentRepository.getDocuments(report.id!!)
                                .map { documents ->
                                    finalReports.add(Report(report.id, report.name, report.status,
                                            report.dateCreated, documents))
                                }
                    }
                    Single.just(finalReports.toList())
                }
    }
}
第一个 Timber.d(( 日志记录代码被执行,

所以我知道它进入了这个方法,但之后的整个 Single.defer 代码没有执行 - 调试没有进入块内部,第二个 Timber.d(( 日志记录代码也没有执行。

override fun getDocuments(reportId: Long): Single<List<Document>> {
        Timber.d("Getting documents for report ID $reportId")
        return Single.defer<List<Document>> {
            try {
                Timber.d("Getting document cursor for report ID $reportId")
                val documentCursor = database.query(
                        Db.DocumentTable.TABLE_NAME,
                        null,
                        Db.DocumentTable.REPORT_ID + "= $reportId",
                        null,
                        null,
                        null,
                        null
                )
                Timber.d("Got document cursor for report ID $reportId. Row count: ${documentCursor.count}")
                getDocuments(documentCursor)
            } catch (e: Exception) {
                Timber.e(e, "Error getting documents for report ID $reportId")
                Single.error(e)
            }
        }
    }

我做错了吗?任何帮助将不胜感激。谢谢!

正如@azizbekian所说,没有订阅getDocuments的内容。但是,不鼓励在该flatMap内调用subscribe(),因为它会中断流程。相反,您应该创建一个内部流,并在报表flatMap中返回该流:

override fun buildUseCaseObservable(params: Void?): Single<List<Report>> {
    return reportRepository
            .getReports()
            .flatMap { reports ->
                Observable.fromIterable(reports)
                .concatMap { report ->
                    documentRepository.getDocuments(report.id!!) 
                    .map { documents ->
                         Report(report.id, report.name, report.status,
                                 report.dateCreated, documents))
                    }.toObservable()
                }
                .toList()
            }
}

以下是您的本质工作:


    documentRepository.getDocuments(...)
                      .map { ...}

没有人订阅此流。除非存在订阅者,否则不会执行流。如果在此代码中添加了一行,您将看到正在执行defer()


    documentRepository.getDocuments(...)
                      .map { ...}
                      .subscribe()

最新更新