我有一个问题,我的 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()