从 Android SyncAdapter 调用服务方法时 gRPC 失败

gRPC fails when service method called from Android SyncAdapter

我花了一些时间才弄清楚以下错误仅在我尝试使用 SyncAdapter 中的 gRPC 客户端时引起:

No functional channel service provider found. Try adding a dependency on the grpc-okhttp or grpc-netty artifact

设置和官方教程完全一样Transferring Data Using Sync Adapters

我使用与来自 grpc-java 的 example 相同的设置生成了 gRPC 代码。示例中的 compile 'com.squareup.okhttp:okhttp:2.2.0' 依赖项不是必需的,因为 compile 'io.grpc:grpc-okhttp:0.9.0' 已修改为自包含。

当从主 activity 调用 gRPC 服务方法时,它工作正常。

我怀疑 grpc-okhttp 必须以某种方式初始化,但不知道如何初始化。

我决定阅读gRPC的代码。我用来创建频道的代码是:

mChannel = ManagedChannelBuilder.forAddress(mHost, mPort)
        .usePlaintext(true).build();

通用 ManagedChannelBuilder class 的工作方式是动态加载所有扩展 ManageChannelBoulder 的 classes 并选择具有最高优先级的。然后选择的 class 被记住在静态变量中。

似乎在 SyncAdapter 的调用期间,okhttp 的相应构建器不可用。我通过对选择的构建器进行硬编码来修复它:

mChannel = OkHttpChannelBuilder.forAddress(mHost, mPort)
        .usePlaintext(true).build();

我希望能拯救某人的夜晚。