/* * Copyright (c) 2014-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.stetho.common; import java.lang.IllegalStateException; /** * Implemented by an object whose methods must be called on a specific thread. If a method is * called from a disallowed thread then {@link IllegalStateException} will be thrown. * To marshal a call to the correct thread, you can use {@link #postAndWait(UncheckedCallable)} or * {@link #postAndWait(Runnable)}, both of which complete synchronously. */ public interface ThreadBound { /** * Checks whether the current thread has access to this object. * @return true if this thread has access to this object; otherwise false */ boolean checkThreadAccess(); /** * Enforces that the current thread has access to this object. * @throws IllegalStateException if the current thread does not have access to this object */ void verifyThreadAccess(); /** * Synchronously executes an {@link UncheckedCallable} on the thread that this object is bound to, * and returns its result. * @param c the {@link UncheckedCallable} to execute * @param <V> the return type of the {@link UncheckedCallable} * @return the return value from {@link UncheckedCallable#call()} * @throws RuntimeException if the {@link UncheckedCallable} could not be executed (the cause * will be null), or if {@link UncheckedCallable#call()} threw an exception (the cause will be the * exception that it threw). */ <V> V postAndWait(UncheckedCallable<V> c); /** * Synchronously executes a {@link Runnable} on the thread that this object is bound to. * @param r the {@link Runnable} to execute * @throws RuntimeException if the {@link Runnable} could not be executed (the cause will be * null), or if {@link Runnable#run()} threw an exception (the cause will be the exception that * it threw). */ void postAndWait(Runnable r); /** * Asynchronously executes a {@link Runnable} on the thread that this object is bound to * after the specified delay. * @param r the {@link Runnable} to execute * @param delayMillis The delay (in milliseconds) until the {@link Runnable} will be executed. * @throws RuntimeException if the {@link Runnable} could not be enqueued. */ void postDelayed(Runnable r, long delayMillis); /** * Removes any pending posts of the given {@link Runnable} that are in the queue. * @param r the {@link Runnable} to remove from the queue */ void removeCallbacks(Runnable r); }