【问题标题】:How to do API call in for loop in android?如何在android中的for循环中调用API?
【发布时间】:2022-10-06 22:20:50
【问题描述】:

我们如何在对象数组列表的 for 循环中执行相同的 API 调用:

private var emergencyContacts: ArrayList<Contact> = ArrayList()

    emergencyContacts.forEach
    {
        contactsViewModel.deleteEmergencyContactsAPI(it.id, it.id2)
    }

    fun deleteEmergencyContactsAPI(patientID: String, contactId: Int) {
        _deleteEmergencyContactsLiveData.postValue(Resource.loading())
        repository.deleteEmergencyContact(patientID, contactId)
            .subscribeOn(Schedulers.computation())
            .subscribeWith(DeleteEmergencyContactsResponse(_deleteEmergencyContactsLiveData))
    }

    inner class DeleteEmergencyContactsResponse(liveData: MutableLiveData<Resource<Status>>) :
        ResponseSingleObserverWrapper<Status, Status>(
            compositeDisposable,
            liveData
        ) {
        override fun onSuccess(t: Status) {
            _deleteEmergencyContactsLiveData.postValue(Resource.success(t))
        }

        override fun onError(e: Throwable) {
            _deleteEmergencyContactsLiveData.postValue(Resource.error(e.message ?: \"\"))
        }
    }

我想在所有 API 调用后执行 UI,它不会影响屏幕性能。

我尝试过使用 Zip 运算符,并行网络 API 调用,但它不能很好地工作,因为 API 调用计数不是静态的。

任何提示或帮助将不胜感激。谢谢

  • 您标记了 rxJava 和协程。你想用哪个?

标签: android kotlin retrofit rx-java kotlin-coroutines


【解决方案1】:

因此,对于需要时间执行的调用,您可以在单独的线程上运行它们。
所以,为此,你使用Coroutines
现在,如果您想从单独的线程在主线程上执行某些操作,Coroutines 也可以这样做。这是一个例子。

CoroutineScope(Dispatchers.IO).launch {
    StuffYouWantOnADifferentThread()
    CoroutineScope(Dispatchers.Main).launch {
        StuffYouWantOnTheMainThread()
    }
}

这里发生的是,IO 协程在后台线程上启动 StuffYouWantOnADifferentThread()。然后,在执行完之后,Main 协程在主线程上执行StuffYouWantOnTheMainThread()

【讨论】:

  • 这是使用协程对回调地狱的再创造,但回调地狱是协程可以解决的事情之一!使用 withContext 而不是启动嵌套协程。
【解决方案2】:

由于其余 api 仍在获取数据,因此 for 循环可以命中下一行。 为了解决这个问题,我建议在数据获取方法中将数据一一添加到适配器。

public void addAll(CoinsMarketsModel newUsers)
    {
     marketModels.add(newUsers);
     notifyDataSetChanged();
    }

并清除数据,

public void clearAll(){
        this.marketModels = new ArrayList<>();
        marketModels.clear();
        notifyDataSetChanged();
    }

称呼全部添加()在您的 api 请求响应方法的最后一行。并且清除所有()在 for 循环的开始。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-05-12
    • 2020-01-11
    • 2018-11-18
    • 2021-06-15
    • 2014-11-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多