У меня есть 4 конечных точки URL API, в своей основной деятельности, когда активность показывает, я сделаю 4 запроса к каждой конечной точке одновременно.Я хочу, чтобы индикатор моего запроса (индикатор выполнения) пропал, если все эти 4 запроса были успешно завершены или если один из них завершился неудачно с кодом запроса 4xx или 5xx.
Так что в основном я хочу выполнить какое-то действие после всехзапросы заканчиваются или один из них не выполнен?
В разработке для iOS я легко могу использовать DispatchGroup
, чтобы сгруппировать некоторые действия и сделать что-то после некоторого условия.Какой общий способ решить эту проблему в 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)
}
}
})
}
, а затем эти два метода будут использоваться в MainАктивность, подобная этой
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()
я хочу скрыть индикатор выполнения, когда эти 2 запроса выполнены успешно.если не удалось, скажем, я хочу показать тост массаж?как это сделать?
Ява в порядке