Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(258)

Unified Diff: net/android/java/src/org/chromium/net/ProxyChangeListener.java

Issue 2812963002: [Cronet] Move initialization to a new thread rather than the UI thread. (Closed)
Patch Set: update tests to account for mRegistered change Created 3 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: net/android/java/src/org/chromium/net/ProxyChangeListener.java
diff --git a/net/android/java/src/org/chromium/net/ProxyChangeListener.java b/net/android/java/src/org/chromium/net/ProxyChangeListener.java
index 1ccf7a597247dfef1e7c1e5daadbdeef7253f39e..503e2eaeb996a0c8459f10830a11f015c88a38f2 100644
--- a/net/android/java/src/org/chromium/net/ProxyChangeListener.java
+++ b/net/android/java/src/org/chromium/net/ProxyChangeListener.java
@@ -11,9 +11,12 @@ import android.content.IntentFilter;
import android.net.Proxy;
import android.net.Uri;
import android.os.Build;
+import android.os.Handler;
+import android.os.Looper;
import android.text.TextUtils;
import android.util.Log;
+import org.chromium.base.BuildConfig;
import org.chromium.base.ContextUtils;
import org.chromium.base.annotations.CalledByNative;
import org.chromium.base.annotations.JNINamespace;
@@ -31,6 +34,9 @@ public class ProxyChangeListener {
private static final String TAG = "ProxyChangeListener";
private static boolean sEnabled = true;
+ private final Looper mLooper;
+ private final Handler mHandler;
+
private long mNativePtr;
private ProxyReceiver mProxyReceiver;
private Delegate mDelegate;
@@ -55,7 +61,10 @@ public class ProxyChangeListener {
public void proxySettingsChanged();
}
- private ProxyChangeListener() {}
+ private ProxyChangeListener() {
+ mLooper = Looper.myLooper();
+ mHandler = new Handler(mLooper);
+ }
public static void setEnabled(boolean enabled) {
sEnabled = enabled;
@@ -77,6 +86,7 @@ public class ProxyChangeListener {
@CalledByNative
public void start(long nativePtr) {
+ assertOnThread();
assert mNativePtr == 0;
mNativePtr = nativePtr;
registerReceiver();
@@ -84,15 +94,21 @@ public class ProxyChangeListener {
@CalledByNative
public void stop() {
+ assertOnThread();
mNativePtr = 0;
unregisterReceiver();
}
private class ProxyReceiver extends BroadcastReceiver {
@Override
- public void onReceive(Context context, Intent intent) {
+ public void onReceive(Context context, final Intent intent) {
if (intent.getAction().equals(Proxy.PROXY_CHANGE_ACTION)) {
- proxySettingsChanged(extractNewProxy(intent));
+ runOnThread(new Runnable() {
+ @Override
+ public void run() {
+ proxySettingsChanged(ProxyReceiver.this, extractNewProxy(intent));
+ }
+ });
}
}
@@ -173,8 +189,12 @@ public class ProxyChangeListener {
}
}
- private void proxySettingsChanged(ProxyConfig cfg) {
- if (!sEnabled) {
+ private void proxySettingsChanged(ProxyReceiver proxyReceiver, ProxyConfig cfg) {
+ if (!sEnabled
+ // Once execution begins on the correct thread, make sure unregisterReceiver()
+ // hasn't been called in the mean time. Ignore the changed signal if
+ // unregisterReceiver() was called.
+ || proxyReceiver != mProxyReceiver) {
return;
}
if (mDelegate != null) {
@@ -211,6 +231,24 @@ public class ProxyChangeListener {
mProxyReceiver = null;
}
+ private boolean onThread() {
+ return mLooper == Looper.myLooper();
+ }
+
+ private void assertOnThread() {
+ if (BuildConfig.DCHECK_IS_ON && !onThread()) {
+ throw new IllegalStateException("Must be called on ProxyChangeListener thread.");
+ }
+ }
+
+ private void runOnThread(Runnable r) {
+ if (onThread()) {
+ r.run();
+ } else {
+ mHandler.post(r);
+ }
+ }
+
/**
* See net/proxy/proxy_config_service_android.cc
*/

Powered by Google App Engine
This is Rietveld 408576698