Android kotlin中的通用grpc请求 类API{ val nonBlockingStub:HealthcareAPIGrpc.HealthcareAPIStub//生成的Java GRPC存根 suspend fun exampleRequest(params:params):ReturnedResult=SuspendCancelableCorroutine{routine-> val obs=对象:StreamObserver{ 覆盖fun onNext(值:ReturnedResult?){ 例程。恢复(值!!) } 覆盖有趣的错误(t:可丢弃?){ 例程。带异常的恢复(t!!) } 覆盖未完成的乐趣(){ } } nonBlockingStub.exampleRequest(参数、obs) } }
所以我正在开发一个Kotlin android应用程序,它有一个用java生成的grpc客户端。最近,我不得不移动所有API请求以使用kotlin协程。对于每个请求,我都必须复制粘贴此exampleRequest函数Android kotlin中的通用grpc请求 类API{ val nonBlockingStub:HealthcareAPIGrpc.HealthcareAPIStub//生成的Java GRPC存根 suspend fun exampleRequest(params:params):ReturnedResult=SuspendCancelableCorroutine{routine-> val obs=对象:StreamObserver{ 覆盖fun onNext(值:ReturnedResult?){ 例程。恢复(值!!) } 覆盖有趣的错误(t:可丢弃?){ 例程。带异常的恢复(t!!) } 覆盖未完成的乐趣(){ } } nonBlockingStub.exampleRequest(参数、obs) } },android,kotlin,grpc,kotlin-coroutines,grpc-java,Android,Kotlin,Grpc,Kotlin Coroutines,Grpc Java,所以我正在开发一个Kotlin android应用程序,它有一个用java生成的grpc客户端。最近,我不得不移动所有API请求以使用kotlin协程。对于每个请求,我都必须复制粘贴此exampleRequest函数 我很好奇是否有可能生成一个通用函数来执行此操作,获取一些参数并调用底层存根函数理想情况下,应该有一个存根生成器来生成适当的调用,作为挂起/流方法,但您仍然可以使用专用的辅助函数抽象大部分转换: fun grpcFlow( @BuilderReference块:挂起(StreamOb
我很好奇是否有可能生成一个通用函数来执行此操作,获取一些参数并调用底层存根函数理想情况下,应该有一个存根生成器来生成适当的调用,作为
挂起
/流
方法,但您仍然可以使用专用的辅助函数抽象大部分转换:
fun grpcFlow(
@BuilderReference块:挂起(StreamObserver)->Unit
):流量=回流量{
//使用ClientCallStreamObserver支持取消
val observer=object:ClientCallStreamObserver(){
覆盖下一个(值:T){
发送阻塞(值)
}
覆盖有趣的错误(t:可丢弃){
取消(取消例外(“GRPC错误”,t))
}
override fun onCompleted()=通道。关闭()
}
块(观察员)
等待关闭{
observer.cancel(“流取消”,null)
}
}
然后您的API就变成:
类API{
val非阻塞存根:HealthcareAPIGrpc.HealthcareAPIStub
suspend fun exampleRequest(参数:参数)=grpcFlow{
//@builderReference应确保使用正确的类型
nonBlockingStub.exampleRequest(参数,it)
}.single()//因为我们只需要一个响应值。
//对于返回(stream ReturnedResult)
suspend fun示例StreamingRequest(参数:参数)=gcpcFlow{
nonBlockingStub.exampleStreamingRequest(参数,it)
}//流量
}
class API {
val nonBlockingStub: HealthcareAPIGrpc.HealthcareAPIStub //Generated Java GRPC Stub
suspend fun exampleRequest(params: Params) : ReturnedResult = suspendCancellableCoroutine { routine ->
val obs = object : StreamObserver<ReturnedResult> {
override fun onNext(value: ReturnedResult?) {
routine.resume(value!!)
}
override fun onError(t: Throwable?) {
routine.resumeWithException(t!!)
}
override fun onCompleted() {
}
}
nonBlockingStub.exampleRequest(params, obs)
}
}