如何解决在Android中,在一个api调用中制作一个api调用列表
在我的一个 android 应用程序中,首先我想调用一个 api,它将返回一个项目列表,该项目将显示在 RecyclerView 中。我还需要为 RecyclerView 的每个项目调用另一个 api 以获取该项目的描述并根据它们的 id 显示每个项目的描述。我该如何解决这种情况。
bytesPerRow
Subject.kt
data class Subject(
val subject: String,val subjectCode:String,val subjectIcon: String,val progress: Double = 0.0,)
SubjectRepository.kt
interface SubjectRepository {
fun getAllSubject(): Observable<List<Subject>>
fun getProgressAnalysisOf(subjectCode: String): Observable<Double>
}
SubjectViewModel.kt
首先我需要调用 getAllSubject(),它会返回一个主题列表,然后我在我的 RecyclerView 中显示这个列表。对于 recycler 视图的每个主题,我必须调用 getProgressAnalysisOf(subjectCode) 并更新该 recyclerView 的项目。
解决方法
终于找到了解决办法。我使用 ConnectableObservable 来解决这个问题。
- 您可以注意到使用了 replay() 运算符 (getAllSubject().replay()) 使 Observable 在新订阅上发出数据,而无需 再次重新执行逻辑。
- 在我的情况下,主题列表将被发出而不使 再次调用 HTTP。如果没有 replay 方法,你可以注意到 getAllSubject() HTTP 调用被多次执行。
- 在第一次订阅中,主题列表直接添加到 Adapter 类和 RecyclerView 直接渲染,无需 科目的进步价值。
- 在第二个订阅中,flatMap() 用于转换列表 受个别对象发射的影响。
- 在同一个 Observable 上,另一个 flatMap 被链接起来执行 每个主题发射的 getProgressAnalysisOf() 方法 获取进度值。
- 收到进度信息后,特定行项目 在 RecyclerView 中更新。
HomeViewModel.kt
class HomeViewModel @Inject constructor(
private val subjectRepository: SubjectRepository,) : BaseViewModel() {
val subjectList = MutableLiveData<List<Subject>>()
val progress = MutableLiveData<Double>
var subjectsObservable: ConnectableObservable<List<Subject>> = subjectRepository.getAllSubject().replay()
fun getAllSubject() {
compositeDisposable += subjectsObservable
.performOnBackgroundOutputOnMain()
.doOnSubscribe { loader.value = true }
.doAfterTerminate { loader.value = false }
.subscribe({
subjectList.value = it
},{
handleException(it)
})
}
fun getProgressAnalysisOf() {
compositeDisposable += subjectsObservable
.performOnBackgroundOutputOnMain()
.flatMap { Observable.fromIterable(it) }
.flatMap { subjectRepository.getProgressAnalysisOf(it.code) }
.subscribe({
analysisData.postValue(it)
},{
handleException(it)
})
}
HomeActivity.kt
class HomeFragment : BaseFragment<HomeViewModel>() {
private val subjectAdapter: SubjectAdapter by lazy {
SubjectAdapter {
}
}
override fun onResume() {
super.onResume()
viewModel.getAllSubject()
viewModel.getPerformanceAnalysisOf()
viewModel.subjectsObservable.connect()
}
override fun observeLiveData() {
observe(viewModel.subjectList) {
subjectAdapter.submitList(it)
}
observe(viewModel.analysisData) {
// update the analysis value for each item
}
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。