You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

2.9 KiB

AndroidChannelBuilder

Since gRPC's 1.12 release, the grpc-android package provides access to the AndroidChannelBuilder class. Given an Android Context, this builder will register a network event listener upon channel construction. The listener is used to automatically respond to changes in the device's network state, avoiding delays and interrupted RPCs that may otherwise occur.

By default, gRPC uses exponential backoff to recover from connection failures. Depending on the scheduled backoff delay when the device regains connectivity, this could result in a one minute or longer delay before gRPC re-establishes the connection. This delay is removed when AndroidChannelBuilder is provided with the app's Android Context. Notifications from the network listener will cause the channel to immediately reconnect upon network recovery.

On Android API levels 24+, AndroidChannelBuilder's network listener mechanism allows graceful switching from cellular to wifi connections. When an Android device on a cellular network connects to a wifi network, there is a brief (typically 30 second) interval when both cellular and wifi networks remain available, then any connections on the cellular network are terminated. By listening for changes in the device's default network, AndroidChannelBuilder sends new RPCs via wifi rather than using an already-established cellular connection. Without listening for pending network changes, new RPCs sent on an already established cellular connection would fail when the device terminates cellular connections.

Note: Currently, AndroidChannelBuilder is only compatible with gRPC OkHttp. We plan to offer additional Android-specific features compatible with both the OkHttp and Cronet transports in the future, but the network listener mechanism is only necessary with OkHttp; the Cronet library internally handles connection management on Android devices.

Example usage:

In your build.gradle file, include a dependency on both grpc-android and grpc-okhttp:

compile 'io.grpc:grpc-android:1.16.1' // CURRENT_GRPC_VERSION
compile 'io.grpc:grpc-okhttp:1.16.1' // CURRENT_GRPC_VERSION

You will also need permission to access the device's network state in your AndroidManifest.xml:

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

When constructing your channel, use AndroidChannelBuilder and provide it with your app's Context:

import io.grpc.android.AndroidChannelBuilder;
...
ManagedChannel channel = AndroidChannelBuilder.forAddress("localhost", 8080)
    .context(getApplicationContext())
    .build();

You continue to use the constructed channel exactly as you would any other channel. gRPC will now monitor and respond to the device's network state automatically. When you shutdown the managed channel, the network listener registered by AndroidChannelBuilder will be unregistered.