在Android中,在一个api调用中制作一个api调用列表 [英] In Android, Make a list of api call inside one api call

查看:37
本文介绍了在Android中,在一个api调用中制作一个api调用列表的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在我的一个 android 应用程序中,首先我想调用一个 api,它将返回一个项目列表,该项目将显示在 RecyclerView 中.我还需要为 RecyclerView 的每个项目调用另一个 api 以获取该项目的描述并根据它们的 id 显示每个项目的描述.我该如何解决这种情况.

In one of my android app, at first I want to call an api, which will return a list of item, and the item will be shown in a RecyclerView. I also need to call another api for each item of the RecyclerView to fetch description of that item and show the description to each item according to their id. How can I resolve this scenario.

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

class HomeViewModel @Inject constructor(
    private val subjectRepository: SubjectRepository,
) : BaseViewModel() {

    val subjectList = MutableLiveData<List<Subject>>()
    val progress = MutableLiveData<Double>

    fun getAllSubject() {
        compositeDisposable += subjectRepository.getAllSubject()
            .performOnBackgroundOutputOnMain()
            .doOnSubscribe { loader.value = true }
            .doAfterTerminate { loader.value = false }
            .subscribe({
                subjectList.value = it
            }, {
                handleException(it)
            })
    }

    fun getProgressAnalysisOf(subjectCode: String) {
        compositeDisposable += subjectRepository. getProgressAnalysisOf(subjectCode)
            .performOnBackgroundOutputOnMain()
            .doOnSubscribe { loader.value = true }
            .doAfterTerminate { loader.value = false }
            .subscribe({
                progress.value = it
            }, {
                handleException(it)
            })
    }
}

首先我需要调用 getAllSubject(),它会返回一个主题列表,然后我在我的 RecyclerView 中显示这个列表.对于 recycler 视图的每个主题,我必须调用 getProgressAnalysisOf(subjectCode) 并更新该 recyclerView 的项目.

first I need to call getAllSubject() which will return a list of Subject and I show this list in my RecyclerView. And for each subject of the recycler view, I have to call getProgressAnalysisOf(subjectCode) and update the item of that recyclerView.

推荐答案

终于找到了解决方案.我使用 ConnectableObservable 来解决这个问题.

Finally, I got a solution. I used ConnectableObservable to solve this issue.

  1. 您可以注意到使用了 replay() 运算符 (getAllSubject().replay())使一个 Observable 在没有新订阅的情况下发出数据再次重新执行逻辑.
  2. 在我的情况下,主题列表将被发出而不使再次调用 HTTP.如果没有 replay 方法,你可以注意到getAllSubject() HTTP 调用被多次执行.
  3. 在第一次订阅中,主题列表直接添加到Adapter 类和 RecyclerView 直接渲染,无需科目的进步价值.
  4. 在第二个订阅中,flatMap() 用于转换列表受个别对象发射的影响.
  5. 在同一个 Observable 上,另一个 flatMap 被链接起来执行每个主题发射的 getProgressAnalysisOf() 方法获取进度值.
  6. 收到进度信息后,特定行项目在 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
        }
    }
}

这篇关于在Android中,在一个api调用中制作一个api调用列表的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆