使用带有 Kotlin 和流的 Android 上的 Apollo 订阅 GraphQL 时处理网络错误
Posted
技术标签:
【中文标题】使用带有 Kotlin 和流的 Android 上的 Apollo 订阅 GraphQL 时处理网络错误【英文标题】:Handle network error when using GraphQL subscription with Apollo on Android with Kotlin and flows 【发布时间】:2021-12-28 16:12:47 【问题描述】:我在 android 上使用 Apollo GraphQL。我正在使用 Apollo 版本 3。 我有订阅,我可以成功订阅并获取更新。 问题是,如果我打开应用程序的飞行模式,则会出现异常:
java.lang.IllegalStateException: WeSocket queue full
at com.apollographql.apollo3.network.ws.DefaultWebSocketEngine$open$3.send(OkHttpWebSocketEngine.kt:90)
at com.apollographql.apollo3.network.ws.WsProtocol.sendMessageMapBinary(WsProtocol.kt:92)
at com.apollographql.apollo3.network.ws.SubscriptionWsProtocol.stopOperation(SubscriptionWsProtocol.kt:69)
at com.apollographql.apollo3.network.ws.WebSocketNetworkTransport$3.invokeSuspend(WebSocketNetworkTransport.kt:144)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33)
at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:106)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
at java.lang.Thread.run(Thread.java:920)
我尝试在返回的流上使用catch
,但它不起作用。
我就是这样做的:
apolloClient.subscribe(ProfileSubscription()).execute().catch
定义订阅的.grapql
文件是:
subscription Profile
syncStatus
offline
我通过调用创建 Apollo 客户端:
ApolloClient.Builder()
.networkTransport(
WebSocketNetworkTransport(
serverUrl = baseUrl
)
).build()
基本 url 使用ws
作为协议:
ws://ec2-xx-xxx-xxx-xx.eu-west-2.compute.amazonaws.com:4000/graphql
如何优雅地处理异常?
【问题讨论】:
您使用的是哪个版本的 Apollo?我有一个类似的问题。我已经在github.com/apollographql/apollo-android/issues/3634 提交了错误报告我不确定我的代码是否正确,但我确信抛出 IllegalStateException 不是正确的响应。 这是阿波罗版本 3 是3.0.0-beta04还是更早的版本? 它是 beta03。我现在看到 beta05 可用。我会检查一下,虽然我不认为行为会改变 我想知道,因为我在 beta04 中遇到了这个问题,但一开始并没有注意到 beta03 的问题。我提交了一个错误报告 github.com/apollographql/apollo-android/issues/3634 并且 beta05 应该有一个修复。 【参考方案1】:我刚刚处理了启动流程的异常:
viewModelScope.launch(CoroutineExceptionHandler _, _ -> )
profilesUpdatesUseCase.subscribe()
方法profilesUpdatesUseCase.subscribe()
是调用的方法:
apolloClient.subscribe(ProfileSubscription()).execute()
当然,ViewModel 最终需要在可能的情况下重新启动流程。
【讨论】:
以上是关于使用带有 Kotlin 和流的 Android 上的 Apollo 订阅 GraphQL 时处理网络错误的主要内容,如果未能解决你的问题,请参考以下文章
使用 Laravel-Excel 和流的方法导出 Excel