gpt4 book ai didi

android - kotlin如何使用coroutine scope调用web服务和处理错误

转载 作者:行者123 更新时间:2023-12-02 12:32:34 24 4
gpt4 key购买 nike

我使用 kotlin 开发了一个 android 应用程序。我使用 swagger 来获取我所有的 Web 服务。如果存在,我想调用 Web 服务并使用 try/catch 处理错误。经过一段时间的研究,关于如何使用这个 WS,我发现我应该将协程与 Dispatchers 一起使用,我使用 GlobalScope 如下:

         GlobalScope.launch(Dispatchers.Default) {
val productsType = mobileApi.apiMobileProductTypeGetAllPost(params, 0, 50, "", "")
withContext(Dispatchers.Main) {
viewProductType.loadAllTypeProduct(productsType)}

这是 loadAllTypeProduct 的代码:

override fun loadAllTypeProduct(data: Array<ProductTypeData>) {
recyclerViewProductTypeList.apply {
recyclerViewProductTypeList.layoutManager = LinearLayoutManager(context, RecyclerView.HORIZONTAL, false)
recyclerViewProductTypeList.adapter = ProductTypeItemAdapter(data, this@HomeFragment, context)
}
}

但是,我发现我应该使用 Coroutine Scope 而不是 Global Scope,而 Global Scope 是非常令人沮丧的。因此,我将我的代码从上面的代码更改为以下代码:

   val scope = CoroutineScope(Dispatchers.Main)
basicViewInterface.showProgressBar()
val task = scope.launch {
try {
withContext(Dispatchers.IO) {
val productsType= mobileApi.apiMobileProductTypeGetAllPost(params, 0, 50, "", "")
viewProductType.loadAllTypeProduct(productsType)
}
basicViewInterface.hideProgressBar()
} catch (e: Throwable) {
e.printStackTrace()
}
}
if (task.isCancelled){
basicViewInterface.displayError("error")
}

我想调用我的 WS 并使用 try/catch 处理异常并在 Toast 中显示错误,我该怎么做。

最佳答案

协程作用域的要点是它在您检测到用户已导航离开当前 Activity 的地方可用,因此您可以在一个中心位置取消它并取消所有子协程。您的更改只是创建了一个局部的、一次性的范围,这与使用 GlobalScope 一样糟糕。如果您的代码在 Activity 或 Fragment 中,则让该类实现 CoroutineScope by MainScope,您可以在 documentation 中查看更详细的示例的 CoroutineScope

至于处理异常,代码应该和你发布的差不多,只是要注意切换上下文。协程范围应指定 Main 作为调度程序,您应该仅为阻塞网络调用切换到 IO,如下所示:

basicViewInterface.showProgressBar()
scope.launch {
try {
val productsType = withContext(Dispatchers.IO) {
mobileApi.apiMobileProductTypeGetAllPost(params, 0, 50, "", "")
}
viewProductType.loadAllTypeProduct(productsType)
basicViewInterface.hideProgressBar()
} catch (e: Throwable) {
basicViewInterface.displayError("error")
}
}

如果将 withContext 推送到 apiMobileProductTypeGetAllPost 的主体中,它会更好、更清晰,因为它是本地化的关注点。从外部看,它应该只是另一个可挂起的函数,您可以调用它而不用担心给定的实现是否在非阻塞上阻塞等底层细节。

我注意到其他人提到协程异常处理程序,但我不建议使用它。它仅在协程层次结构的顶层工作,其目的是仅捕获由于编程错误而未在业务代码中适当处理的那些异常。它等同于 Java 中的 Thread.uncaughtExceptionHandler

关于android - kotlin如何使用coroutine scope调用web服务和处理错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59877004/

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