Skip to content

Commit 4638d70

Browse files
committed
replace unregister boolean with Runnable, use @GuardedBy and errorprone plugin
1 parent 03daad5 commit 4638d70

File tree

2 files changed

+32
-13
lines changed

2 files changed

+32
-13
lines changed

android/build.gradle

+6
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,18 @@ buildscript {
77
google()
88
jcenter()
99
mavenCentral()
10+
maven {
11+
url "https://plugins.gradle.org/m2/"
12+
}
1013
}
1114
dependencies {
1215
classpath 'com.android.tools.build:gradle:3.0.1'
16+
classpath "net.ltgt.gradle:gradle-errorprone-plugin:0.0.13"
1317
}
1418
}
1519

20+
apply plugin: "net.ltgt.errorprone"
21+
1622
android {
1723
compileSdkVersion 27
1824
defaultConfig {

android/src/main/java/io/grpc/android/AndroidChannelBuilder.java

+26-13
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@
3737
import io.grpc.internal.GrpcUtil;
3838
import java.util.concurrent.TimeUnit;
3939
import javax.annotation.Nullable;
40+
import javax.annotation.concurrent.GuardedBy;
4041

4142
/**
4243
* Builds a {@link ManagedChannel} that, when provided with a {@link Context}, will automatically
@@ -121,8 +122,8 @@ static final class AndroidChannel extends ManagedChannel {
121122

122123
private final Object lock = new Object();
123124

124-
// May only go from true to false, and lock must be held when assigning this
125-
private volatile boolean needToUnregisterListener;
125+
@GuardedBy("lock")
126+
private Runnable unregisterRunnable;
126127

127128
@VisibleForTesting
128129
AndroidChannel(final ManagedChannel delegate, @Nullable Context context) {
@@ -133,12 +134,12 @@ static final class AndroidChannel extends ManagedChannel {
133134
connectivityManager =
134135
(ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
135136
configureNetworkMonitoring();
136-
needToUnregisterListener = true;
137137
} else {
138138
connectivityManager = null;
139139
}
140140
}
141141

142+
@GuardedBy("lock")
142143
private void configureNetworkMonitoring() {
143144
// Android N added the registerDefaultNetworkCallback API to listen to changes in the device's
144145
// default network. For earlier Android API levels, use the BroadcastReceiver API.
@@ -152,25 +153,37 @@ private void configureNetworkMonitoring() {
152153

153154
defaultNetworkCallback = new DefaultNetworkCallback(isConnected);
154155
connectivityManager.registerDefaultNetworkCallback(defaultNetworkCallback);
156+
unregisterRunnable =
157+
new Runnable() {
158+
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
159+
@Override
160+
public void run() {
161+
connectivityManager.unregisterNetworkCallback(defaultNetworkCallback);
162+
defaultNetworkCallback = null;
163+
}
164+
};
155165
} else {
156166
networkReceiver = new NetworkReceiver();
157167
IntentFilter networkIntentFilter =
158168
new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION);
159169
context.registerReceiver(networkReceiver, networkIntentFilter);
170+
unregisterRunnable =
171+
new Runnable() {
172+
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
173+
@Override
174+
public void run() {
175+
context.unregisterReceiver(networkReceiver);
176+
networkReceiver = null;
177+
}
178+
};
160179
}
161180
}
162181

163182
private void unregisterNetworkListener() {
164-
if (needToUnregisterListener) {
165-
synchronized (lock) {
166-
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N && connectivityManager != null) {
167-
connectivityManager.unregisterNetworkCallback(defaultNetworkCallback);
168-
defaultNetworkCallback = null;
169-
} else {
170-
context.unregisterReceiver(networkReceiver);
171-
networkReceiver = null;
172-
}
173-
needToUnregisterListener = false;
183+
synchronized (lock) {
184+
if (unregisterRunnable != null) {
185+
unregisterRunnable.run();
186+
unregisterRunnable = null;
174187
}
175188
}
176189
}

0 commit comments

Comments
 (0)