从 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();
我希望能拯救某人的夜晚。
我花了一些时间才弄清楚以下错误仅在我尝试使用 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();
我希望能拯救某人的夜晚。