/** * 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 java.util.Map; import android.os.Looper; import com.facebook.react.common.MapBuilder; /** * Specifies which {@link MessageQueueThread}s must be used to run the various contexts of * execution within catalyst (Main UI thread, native modules, and JS). Some of these queues *may* be * the same but should be coded against as if they are different. * * UI Queue Thread: The standard Android main UI thread and Looper. Not configurable. * Native Modules Queue Thread: The thread and Looper that native modules are invoked on. * JS Queue Thread: The thread and Looper that JS is executed on. */ public class CatalystQueueConfiguration { private final MessageQueueThread mUIQueueThread; private final MessageQueueThread mNativeModulesQueueThread; private final MessageQueueThread mJSQueueThread; private CatalystQueueConfiguration( MessageQueueThread uiQueueThread, MessageQueueThread nativeModulesQueueThread, MessageQueueThread jsQueueThread) { mUIQueueThread = uiQueueThread; mNativeModulesQueueThread = nativeModulesQueueThread; mJSQueueThread = jsQueueThread; } public MessageQueueThread getUIQueueThread() { return mUIQueueThread; } public MessageQueueThread getNativeModulesQueueThread() { return mNativeModulesQueueThread; } public MessageQueueThread getJSQueueThread() { return mJSQueueThread; } /** * Should be called when the corresponding {@link com.facebook.react.bridge.CatalystInstance} * is destroyed so that we shut down the proper queue threads. */ public void destroy() { if (mNativeModulesQueueThread.getLooper() != Looper.getMainLooper()) { mNativeModulesQueueThread.quitSynchronous(); } if (mJSQueueThread.getLooper() != Looper.getMainLooper()) { mJSQueueThread.quitSynchronous(); } } public static CatalystQueueConfiguration create( CatalystQueueConfigurationSpec spec, QueueThreadExceptionHandler exceptionHandler) { Map<MessageQueueThreadSpec, MessageQueueThread> specsToThreads = MapBuilder.newHashMap(); MessageQueueThreadSpec uiThreadSpec = MessageQueueThreadSpec.mainThreadSpec(); MessageQueueThread uiThread = MessageQueueThread.create( uiThreadSpec, exceptionHandler); specsToThreads.put(uiThreadSpec, uiThread); MessageQueueThread jsThread = specsToThreads.get(spec.getJSQueueThreadSpec()); if (jsThread == null) { jsThread = MessageQueueThread.create(spec.getJSQueueThreadSpec(), exceptionHandler); } MessageQueueThread nativeModulesThread = specsToThreads.get(spec.getNativeModulesQueueThreadSpec()); if (nativeModulesThread == null) { nativeModulesThread = MessageQueueThread.create(spec.getNativeModulesQueueThreadSpec(), exceptionHandler); } return new CatalystQueueConfiguration(uiThread, nativeModulesThread, jsThread); } }