我有一个问题,我的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)
}
}
}
我做得不对吗?任何帮助都将不胜感激。谢谢!
发布于 2018-01-08 08:59:00
正如@azizbekian所说,没有任何东西可以订阅getDocuments
。但是,不鼓励在该subscribe()
内部调用flatMap
,因为它破坏了流。相反,您应该创建一个内部流并在报表的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()
}
}
https://stackoverflow.com/questions/48146529
复制相似问题