Index: base/android/java/src/org/chromium/base/JavaHandlerThread.java |
diff --git a/base/android/java/src/org/chromium/base/JavaHandlerThread.java b/base/android/java/src/org/chromium/base/JavaHandlerThread.java |
index cd057282b88513b4cc48d3d70b16978b9ac58849..c2f203df9e53e6df4af3ed6131db2b5683793ba5 100644 |
--- a/base/android/java/src/org/chromium/base/JavaHandlerThread.java |
+++ b/base/android/java/src/org/chromium/base/JavaHandlerThread.java |
@@ -8,19 +8,23 @@ import android.annotation.TargetApi; |
import android.os.Build; |
import android.os.Handler; |
import android.os.HandlerThread; |
+import android.os.Looper; |
import org.chromium.base.annotations.CalledByNative; |
import org.chromium.base.annotations.JNINamespace; |
/** |
- * This class is an internal detail of the native counterpart. |
- * It is instantiated and owned by the native object. |
+ * Thread in Java with an Anroid Handler. This class is not thread safe. |
*/ |
@JNINamespace("base::android") |
-class JavaHandlerThread { |
- final HandlerThread mThread; |
+public class JavaHandlerThread { |
+ private final HandlerThread mThread; |
- private JavaHandlerThread(String name) { |
+ /** |
+ * Construct a java-only instance. Can be connected with native side later. |
+ * Useful for cases where a java thread is needed before native library is loaded. |
+ */ |
+ public JavaHandlerThread(String name) { |
mThread = new HandlerThread(name); |
} |
@@ -29,9 +33,18 @@ class JavaHandlerThread { |
return new JavaHandlerThread(name); |
} |
- @CalledByNative |
- private void start(final long nativeThread, final long nativeEvent) { |
+ public Looper getLooper() { |
+ return mThread.getLooper(); |
+ } |
+ |
+ public void maybeStart() { |
+ if (hasStarted()) return; |
mThread.start(); |
+ } |
+ |
+ @CalledByNative |
+ private void startAndInitialize(final long nativeThread, final long nativeEvent) { |
+ maybeStart(); |
new Handler(mThread.getLooper()).post(new Runnable() { |
@Override |
public void run() { |
@@ -43,6 +56,7 @@ class JavaHandlerThread { |
@TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR2) |
@CalledByNative |
private void stop(final long nativeThread, final long nativeEvent) { |
+ assert hasStarted(); |
final boolean quitSafely = Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2; |
new Handler(mThread.getLooper()).post(new Runnable() { |
@Override |
@@ -54,6 +68,10 @@ class JavaHandlerThread { |
if (quitSafely) mThread.quitSafely(); |
} |
+ private boolean hasStarted() { |
+ return mThread.getState() != Thread.State.NEW; |
+ } |
+ |
private native void nativeInitializeThread(long nativeJavaHandlerThread, long nativeEvent); |
private native void nativeStopThread(long nativeJavaHandlerThread, long nativeEvent); |
} |