From 6f76113bf1cc5e467172e2ccdcc66da12fed0ef1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?xiatian=20=5B=E5=A4=8F=E5=A4=A9=5D?= Date: Tue, 23 May 2017 10:22:54 +0800 Subject: [PATCH 1/2] Android:Make MessageQueueThreadImpl startNewBackgroundThread more efficient. --- .../queue/MessageQueueHandlerThread.java | 51 +++++++++++++++++++ .../bridge/queue/MessageQueueThreadImpl.java | 25 ++------- 2 files changed, 54 insertions(+), 22 deletions(-) create mode 100644 ReactAndroid/src/main/java/com/facebook/react/bridge/queue/MessageQueueHandlerThread.java 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..c2251a9140a5 --- /dev/null +++ b/ReactAndroid/src/main/java/com/facebook/react/bridge/queue/MessageQueueHandlerThread.java @@ -0,0 +1,51 @@ +/** + * 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; + +class MessageQueueHandlerThread extends Thread { + private Looper mLooper; + + protected MessageQueueHandlerThread(String name, long stackSize) { + super(null, null, name, stackSize); + } + + private void onLooperPrepared() { + } + + @Override + public void run() { + Looper.prepare(); + synchronized (this) { + mLooper = Looper.myLooper(); + notifyAll(); + } + onLooperPrepared(); + 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 653d90dec8ac..633db187a78f 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 @@ -184,27 +184,8 @@ private static MessageQueueThreadImpl startNewBackgroundThread( final String name, long stackSize, QueueThreadExceptionHandler exceptionHandler) { - final SimpleSettableFuture looperFuture = new SimpleSettableFuture<>(); - final SimpleSettableFuture mqtFuture = 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()); - MessageQueueThreadRegistry.register(mqtFuture.getOrThrow()); - - Looper.loop(); - } - }, "mqt_" + name, stackSize); - bgThread.start(); - - Looper myLooper = looperFuture.getOrThrow(); - MessageQueueThreadImpl mqt = new MessageQueueThreadImpl(name, myLooper, exceptionHandler); - mqtFuture.set(mqt); - - return mqt; + MessageQueueHandlerThread messageQueueHandlerThread = new MessageQueueHandlerThread("mqt_" + name, stackSize); + messageQueueHandlerThread.start(); + return new MessageQueueThreadImpl(name, messageQueueHandlerThread.getLooper(), exceptionHandler); } } From 43d9ac1ea0eab75a500ceb174aa943797b1fd40e Mon Sep 17 00:00:00 2001 From: chnfeeeeeef Date: Wed, 24 May 2017 10:25:29 +0800 Subject: [PATCH 2/2] Update MessageQueueHandlerThread.java Remove unused onLooperPrepared method ,add Process.setThreadPriority(Process.THREAD_PRIORITY_DISPLAY) code to MessageQueueHandlerThread --- .../react/bridge/queue/MessageQueueHandlerThread.java | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) 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 index c2251a9140a5..dd52c4f7b5d7 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/bridge/queue/MessageQueueHandlerThread.java +++ b/ReactAndroid/src/main/java/com/facebook/react/bridge/queue/MessageQueueHandlerThread.java @@ -10,6 +10,7 @@ package com.facebook.react.bridge.queue; import android.os.Looper; +import android.os.Process; class MessageQueueHandlerThread extends Thread { private Looper mLooper; @@ -18,17 +19,14 @@ protected MessageQueueHandlerThread(String name, long stackSize) { super(null, null, name, stackSize); } - private void onLooperPrepared() { - } - @Override public void run() { + Process.setThreadPriority(Process.THREAD_PRIORITY_DISPLAY); Looper.prepare(); synchronized (this) { mLooper = Looper.myLooper(); notifyAll(); } - onLooperPrepared(); Looper.loop(); }