gpt4 book ai didi

java - 在所有网络请求完成或其中一个失败后如何执行操作?

转载 作者:搜寻专家 更新时间:2023-11-01 09:20:18 24 4
gpt4 key购买 nike

我有 4 个 API URL 端点,在我的主要 Activity 中,当 Activity 显示时,我将同时向每个端点发出 4 个请求。如果所有 4 个请求都成功完成,或者如果其中一个请求失败,请求代码为 4xx 或 5xx,我想让我的请求指示器(进度条)消失。

所以基本上我想在所有请求完成或其中一个请求失败后执行一些操作?

在 iOS 开发中,我可以很容易地使用 DispatchGroup 来分组一些 Action ,并在某些条件之后做一些事情。在 Android 中解决此问题的常用方法是什么?

这是我使用的代码,为了简化,假设我有 2 种方法向服务器发出请求。我正在使用改造:

首先,获取产品:

fun getProductsFromServer(customerID: String, type: String = "", categoryID: String = "" , completion: (errorMessage: String?, products: ArrayList<Product>?) -> Unit) {

val lakuinAPI = RetrofitHandler.getInstance(LakuinAPI::class.java)
val call = lakuinAPI.getProductData("1","0","0","100000000000",type = type,customer_id = customerID,categories_id = categoryID)

call.enqueue(object: Callback<ProductData> {

override fun onFailure(call: Call<ProductData>, t: Throwable) {
completion("Failed to make netwroking call : ${t.localizedMessage}", null)
}

override fun onResponse(call: Call<ProductData>, response: Response<ProductData>) {

val productList = ArrayList<Product>()

if (!response.isSuccessful) {
completion("Error: ${response.code()}",productList)
return
}

val jsonProductData = response.body() ?: return
val statusSuccess = jsonProductData.success

if (statusSuccess == "1") {

val products = jsonProductData.product_data
completion(null,products)

} else if (statusSuccess == "0") {

val errorMessageFromServer = jsonProductData.message
completion(errorMessageFromServer,productList)


}


}


})
}

第二,获得横幅

fun getBannersFromServer(completion: (errorMessage: String?, banners: ArrayList<Banner>?) -> Unit) {

val lakuinAPI = RetrofitHandler.getInstance(LakuinAPI::class.java)
val call = lakuinAPI.getBanners()

call.enqueue(object : Callback<BannerData> {

override fun onFailure(call: Call<BannerData>, t: Throwable) {
completion("Failed to make netwroking call : ${t.localizedMessage}", null)
}

override fun onResponse(call: Call<BannerData>, response: Response<BannerData>) {

val bannerList = ArrayList<Banner>()

if (!response.isSuccessful()) {
completion("Error: ${response.code()}",bannerList)
return
}

val jsonBannerData = response.body() ?: return
val statusSuccess = jsonBannerData.success

if (statusSuccess == "1") {

val banners = jsonBannerData.data
completion(null,banners)

} else if (statusSuccess == "0") {
val errorMessageFromServer = jsonBannerData.message
completion(errorMessageFromServer,bannerList)


}

}


})




}

然后这两个方法将像这样在主 Activity 中使用

private fun getProducts(type: String) {

Product.getProductsFromServer(customerID = userData.id.toString(), type = type) { errorMessage, products ->

errorMessage?.let {
activity?.toast(it)
} ?: run {

val productList = products ?: ArrayList()
setUpRecyclerView(type = type,products = productList)

}


}

}


private fun getBanners() {


Banner.getBannersFromServer { errorMessage, banners ->

errorMessage?.let {
activity?.toast(it)
} ?: run {
val bannerList = banners ?: ArrayList()
setUpImageSlideShow(banners = bannerList)
}


}
}

所以,在调用 getBanners()getProducts() 之后,我想在这两个请求成功时隐藏进度条。如果失败让我说我想展示 toast 按摩?怎么做?

Java 没问题

最佳答案

为了实现这一点,使用 Anko如果您使用 Kotlin 进行 Android 开发,则这是首选方式。

doAsync {
// ...
}

您可以使用 AsyncTask 实现相同的效果也是,而且它是一个 Android API,而不是 JavaKotlin 的语言功能。像这样使用 AsyncTask:

class someTask() : AsyncTask<Void, Void, String>() {
override fun doInBackground(vararg params: Void?): String? {
// ...
}

override fun onPreExecute() {
super.onPreExecute()
// ...
}

override fun onProgressUpdate(vararg text: String?) {
super.onPostExecute(result)
// ...
}

override fun onPostExecute(result: String?) {
super.onPostExecute(result)
// ...
}
}

请关注这个link查看任务在执行异步任务时如何响应。

关于java - 在所有网络请求完成或其中一个失败后如何执行操作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56590128/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com