Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/233.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
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 - Fatal编程技术网

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请求 类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

所以我正在开发一个Kotlin android应用程序,它有一个用java生成的grpc客户端。最近,我不得不移动所有API请求以使用kotlin协程。对于每个请求,我都必须复制粘贴此exampleRequest函数


我很好奇是否有可能生成一个通用函数来执行此操作,获取一些参数并调用底层存根函数

理想情况下,应该有一个存根生成器来生成适当的调用,作为
挂起
/
方法,但您仍然可以使用专用的辅助函数抽象大部分转换:

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)
    }
}