Skip to content

Commit 69b49bf

Browse files
committed
replace unregister boolean with Runnable, use @GuardedBy and errorprone plugin
1 parent 875de8f commit 69b49bf

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
@@ -120,8 +121,8 @@ static final class AndroidChannel extends ManagedChannel {
120121

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

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

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

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

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

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

0 commit comments

Comments
 (0)