diff --git a/ReactAndroid/src/main/java/com/facebook/react/bridge/queue/MessageQueueHandlerThread.java b/ReactAndroid/src/main/java/com/facebook/react/bridge/queue/MessageQueueHandlerThread.java new file mode 100644 index 000000000000..dd52c4f7b5d7 --- /dev/null +++ b/ReactAndroid/src/main/java/com/facebook/react/bridge/queue/MessageQueueHandlerThread.java @@ -0,0 +1,49 @@ +/** + * Copyright (c) 2015-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + */ + +package com.facebook.react.bridge.queue; + +import android.os.Looper; +import android.os.Process; + +class MessageQueueHandlerThread extends Thread { + private Looper mLooper; + + protected MessageQueueHandlerThread(String name, long stackSize) { + super(null, null, name, stackSize); + } + + @Override + public void run() { + Process.setThreadPriority(Process.THREAD_PRIORITY_DISPLAY); + Looper.prepare(); + synchronized (this) { + mLooper = Looper.myLooper(); + notifyAll(); + } + Looper.loop(); + } + + + public Looper getLooper() { + if (!isAlive()) { + return null; + } + + synchronized (this) { + while (isAlive() && mLooper == null) { + try { + wait(); + } catch (InterruptedException e) { + } + } + } + return mLooper; + } +} diff --git a/ReactAndroid/src/main/java/com/facebook/react/bridge/queue/MessageQueueThreadImpl.java b/ReactAndroid/src/main/java/com/facebook/react/bridge/queue/MessageQueueThreadImpl.java index 1afaa10ce5b1..304e306148d8 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/bridge/queue/MessageQueueThreadImpl.java +++ b/ReactAndroid/src/main/java/com/facebook/react/bridge/queue/MessageQueueThreadImpl.java @@ -179,24 +179,11 @@ public void run() { * When this method exits, the new MessageQueueThreadImpl is ready to receive events. */ private static MessageQueueThreadImpl startNewBackgroundThread( - final String name, - long stackSize, - QueueThreadExceptionHandler exceptionHandler) { - final SimpleSettableFuture looperFuture = new SimpleSettableFuture<>(); - Thread bgThread = new Thread(null, - new Runnable() { - @Override - public void run() { - Process.setThreadPriority(Process.THREAD_PRIORITY_DISPLAY); - Looper.prepare(); - - looperFuture.set(Looper.myLooper()); - Looper.loop(); - } - }, "mqt_" + name, stackSize); - bgThread.start(); - - Looper myLooper = looperFuture.getOrThrow(); - return new MessageQueueThreadImpl(name, myLooper, exceptionHandler); + final String name, + long stackSize, + QueueThreadExceptionHandler exceptionHandler) { + MessageQueueHandlerThread messageQueueHandlerThread = new MessageQueueHandlerThread("mqt_" + name, stackSize); + messageQueueHandlerThread.start(); + return new MessageQueueThreadImpl(name, messageQueueHandlerThread.getLooper(), exceptionHandler); } }