通常,客户端可以使用以下命令取消gRPC调用:
(requestObserver as ClientCallStreamObserver<Request>)
.cancel("Cancelled", null)
但是,它显示在Javadoc中:
CancellableContext withCancellation = Context.current().withCancellation();
// do stuff
withCancellation.cancel(t);
取消客户呼叫并通知服务器的“正确”方法是哪种?
编辑:
为了使事情更加混乱,还有ManagedChannel.shutdown*
。
答案 0 :(得分:1)
两者都是可接受且适当的。
adView = (AdView)findViewById(R.id.ads);
adrequest =new AdRequest.Builder().build ;
adView.loadAd(adrequest);
通常比较容易,因为它的样板更少。通常应首选。但是,它不是线程安全的。就像在StreamObserver上正常发送一样。它还需要对RPC有直接的了解;您可能没有更高级的代码来协调取消操作,因为它甚至可能不知道RPC。
使用clientCallStreamObserver.cancel()
取消进行线程安全的取消,并减少对RPC的了解。可以在类似于线程中断或将来取消的情况下使用上下文取消。并非Context
应该被视为资源,并且最终必须取消它们,以避免泄漏内存。 (当上下文达到其“正常”使用寿命时,可以使用CancellableContext
。)