19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2006 The Android Open Source Project 39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License. 69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at 79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and 149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License. 159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage android.os; 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19a38fbf63fd2a29884637a59387643c801ed4f663Eugene Suslaimport android.annotation.NonNull; 20a38fbf63fd2a29884637a59387643c801ed4f663Eugene Suslaimport android.annotation.Nullable; 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Log; 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Printer; 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.lang.reflect.Modifier; 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * A Handler allows you to send and process {@link Message} and Runnable 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * objects associated with a thread's {@link MessageQueue}. Each Handler 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * instance is associated with a single thread and that thread's message 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * queue. When you create a new Handler, it is bound to the thread / 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * message queue of the thread that is creating it -- from that point on, 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * it will deliver messages and runnables to that message queue and execute 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * them as they come out of the message queue. 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>There are two main uses for a Handler: (1) to schedule messages and 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * runnables to be executed as some point in the future; and (2) to enqueue 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * an action to be performed on a different thread than your own. 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>Scheduling messages is accomplished with the 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #post}, {@link #postAtTime(Runnable, long)}, 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #postDelayed}, {@link #sendEmptyMessage}, 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #sendMessage}, {@link #sendMessageAtTime}, and 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #sendMessageDelayed} methods. The <em>post</em> versions allow 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you to enqueue Runnable objects to be called by the message queue when 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * they are received; the <em>sendMessage</em> versions allow you to enqueue 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * a {@link Message} object containing a bundle of data that will be 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * processed by the Handler's {@link #handleMessage} method (requiring that 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you implement a subclass of Handler). 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>When posting or sending to a Handler, you can either 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * allow the item to be processed as soon as the message queue is ready 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to do so, or specify a delay before it gets processed or absolute time for 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * it to be processed. The latter two allow you to implement timeouts, 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * ticks, and other timing-based behavior. 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>When a 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * process is created for your application, its main thread is dedicated to 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * running a message queue that takes care of managing the top-level 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * application objects (activities, broadcast receivers, etc) and any windows 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * they create. You can create your own threads, and communicate back with 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the main application thread through a Handler. This is done by calling 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the same <em>post</em> or <em>sendMessage</em> methods as before, but from 6342855149750fb848b0d743cf0e5f204a05be2f07Chris Palmer * your new thread. The given Runnable or Message will then be scheduled 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * in the Handler's message queue and processed when appropriate. 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class Handler { 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Set this flag to true to detect anonymous, local or member classes 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * that extend this Handler class and that are not static. These kind 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * of classes can potentially create leaks. 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final boolean FIND_POTENTIAL_LEAKS = false; 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final String TAG = "Handler"; 74a38fbf63fd2a29884637a59387643c801ed4f663Eugene Susla private static Handler MAIN_THREAD_HANDLER = null; 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Callback interface you can use when instantiating a Handler to avoid 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * having to implement your own subclass of Handler. 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public interface Callback { 81dcc535723a23ab15d00ba39ab7f452b7941616f1Pavel Grafov /** 82dcc535723a23ab15d00ba39ab7f452b7941616f1Pavel Grafov * @param msg A {@link android.os.Message Message} object 83dcc535723a23ab15d00ba39ab7f452b7941616f1Pavel Grafov * @return True if no further handling is desired 84dcc535723a23ab15d00ba39ab7f452b7941616f1Pavel Grafov */ 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean handleMessage(Message msg); 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Subclasses must implement this to receive messages. 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void handleMessage(Message msg) { 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Handle system messages here. 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void dispatchMessage(Message msg) { 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (msg.callback != null) { 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project handleCallback(msg); 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mCallback != null) { 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mCallback.handleMessage(msg)) { 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project handleMessage(msg); 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 111a2910d0abbbe18ba1710dfd4a31af45769632255Jeff Brown * Default constructor associates this handler with the {@link Looper} for the 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * current thread. 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 114a2910d0abbbe18ba1710dfd4a31af45769632255Jeff Brown * If this thread does not have a looper, this handler won't be able to receive messages 115a2910d0abbbe18ba1710dfd4a31af45769632255Jeff Brown * so an exception is thrown. 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Handler() { 118a2910d0abbbe18ba1710dfd4a31af45769632255Jeff Brown this(null, false); 1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 122a2910d0abbbe18ba1710dfd4a31af45769632255Jeff Brown * Constructor associates this handler with the {@link Looper} for the 1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * current thread and takes a callback interface in which you can handle 1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * messages. 125a2910d0abbbe18ba1710dfd4a31af45769632255Jeff Brown * 126a2910d0abbbe18ba1710dfd4a31af45769632255Jeff Brown * If this thread does not have a looper, this handler won't be able to receive messages 127a2910d0abbbe18ba1710dfd4a31af45769632255Jeff Brown * so an exception is thrown. 128a2910d0abbbe18ba1710dfd4a31af45769632255Jeff Brown * 129a2910d0abbbe18ba1710dfd4a31af45769632255Jeff Brown * @param callback The callback interface in which to handle messages, or null. 1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Handler(Callback callback) { 132a2910d0abbbe18ba1710dfd4a31af45769632255Jeff Brown this(callback, false); 133a2910d0abbbe18ba1710dfd4a31af45769632255Jeff Brown } 134a2910d0abbbe18ba1710dfd4a31af45769632255Jeff Brown 135a2910d0abbbe18ba1710dfd4a31af45769632255Jeff Brown /** 136a2910d0abbbe18ba1710dfd4a31af45769632255Jeff Brown * Use the provided {@link Looper} instead of the default one. 137a2910d0abbbe18ba1710dfd4a31af45769632255Jeff Brown * 138a2910d0abbbe18ba1710dfd4a31af45769632255Jeff Brown * @param looper The looper, must not be null. 139a2910d0abbbe18ba1710dfd4a31af45769632255Jeff Brown */ 140a2910d0abbbe18ba1710dfd4a31af45769632255Jeff Brown public Handler(Looper looper) { 141a2910d0abbbe18ba1710dfd4a31af45769632255Jeff Brown this(looper, null, false); 142a2910d0abbbe18ba1710dfd4a31af45769632255Jeff Brown } 143a2910d0abbbe18ba1710dfd4a31af45769632255Jeff Brown 144a2910d0abbbe18ba1710dfd4a31af45769632255Jeff Brown /** 145a2910d0abbbe18ba1710dfd4a31af45769632255Jeff Brown * Use the provided {@link Looper} instead of the default one and take a callback 146a2910d0abbbe18ba1710dfd4a31af45769632255Jeff Brown * interface in which to handle messages. 147a2910d0abbbe18ba1710dfd4a31af45769632255Jeff Brown * 148a2910d0abbbe18ba1710dfd4a31af45769632255Jeff Brown * @param looper The looper, must not be null. 149a2910d0abbbe18ba1710dfd4a31af45769632255Jeff Brown * @param callback The callback interface in which to handle messages, or null. 150a2910d0abbbe18ba1710dfd4a31af45769632255Jeff Brown */ 151a2910d0abbbe18ba1710dfd4a31af45769632255Jeff Brown public Handler(Looper looper, Callback callback) { 152a2910d0abbbe18ba1710dfd4a31af45769632255Jeff Brown this(looper, callback, false); 153a2910d0abbbe18ba1710dfd4a31af45769632255Jeff Brown } 154a2910d0abbbe18ba1710dfd4a31af45769632255Jeff Brown 155a2910d0abbbe18ba1710dfd4a31af45769632255Jeff Brown /** 156a2910d0abbbe18ba1710dfd4a31af45769632255Jeff Brown * Use the {@link Looper} for the current thread 157a2910d0abbbe18ba1710dfd4a31af45769632255Jeff Brown * and set whether the handler should be asynchronous. 158a2910d0abbbe18ba1710dfd4a31af45769632255Jeff Brown * 159a2910d0abbbe18ba1710dfd4a31af45769632255Jeff Brown * Handlers are synchronous by default unless this constructor is used to make 160a2910d0abbbe18ba1710dfd4a31af45769632255Jeff Brown * one that is strictly asynchronous. 161a2910d0abbbe18ba1710dfd4a31af45769632255Jeff Brown * 162a2910d0abbbe18ba1710dfd4a31af45769632255Jeff Brown * Asynchronous messages represent interrupts or events that do not require global ordering 1639840c07667bb0363c93fb8459e6c08f7e30d5df1Jeff Brown * with respect to synchronous messages. Asynchronous messages are not subject to 164a2910d0abbbe18ba1710dfd4a31af45769632255Jeff Brown * the synchronization barriers introduced by {@link MessageQueue#enqueueSyncBarrier(long)}. 165a2910d0abbbe18ba1710dfd4a31af45769632255Jeff Brown * 166a2910d0abbbe18ba1710dfd4a31af45769632255Jeff Brown * @param async If true, the handler calls {@link Message#setAsynchronous(boolean)} for 167a2910d0abbbe18ba1710dfd4a31af45769632255Jeff Brown * each {@link Message} that is sent to it or {@link Runnable} that is posted to it. 168a2910d0abbbe18ba1710dfd4a31af45769632255Jeff Brown * 169a2910d0abbbe18ba1710dfd4a31af45769632255Jeff Brown * @hide 170a2910d0abbbe18ba1710dfd4a31af45769632255Jeff Brown */ 171a2910d0abbbe18ba1710dfd4a31af45769632255Jeff Brown public Handler(boolean async) { 172a2910d0abbbe18ba1710dfd4a31af45769632255Jeff Brown this(null, async); 173a2910d0abbbe18ba1710dfd4a31af45769632255Jeff Brown } 174a2910d0abbbe18ba1710dfd4a31af45769632255Jeff Brown 175a2910d0abbbe18ba1710dfd4a31af45769632255Jeff Brown /** 176a2910d0abbbe18ba1710dfd4a31af45769632255Jeff Brown * Use the {@link Looper} for the current thread with the specified callback interface 177a2910d0abbbe18ba1710dfd4a31af45769632255Jeff Brown * and set whether the handler should be asynchronous. 178a2910d0abbbe18ba1710dfd4a31af45769632255Jeff Brown * 179a2910d0abbbe18ba1710dfd4a31af45769632255Jeff Brown * Handlers are synchronous by default unless this constructor is used to make 180a2910d0abbbe18ba1710dfd4a31af45769632255Jeff Brown * one that is strictly asynchronous. 181a2910d0abbbe18ba1710dfd4a31af45769632255Jeff Brown * 182a2910d0abbbe18ba1710dfd4a31af45769632255Jeff Brown * Asynchronous messages represent interrupts or events that do not require global ordering 1839840c07667bb0363c93fb8459e6c08f7e30d5df1Jeff Brown * with respect to synchronous messages. Asynchronous messages are not subject to 184a2910d0abbbe18ba1710dfd4a31af45769632255Jeff Brown * the synchronization barriers introduced by {@link MessageQueue#enqueueSyncBarrier(long)}. 185a2910d0abbbe18ba1710dfd4a31af45769632255Jeff Brown * 186a2910d0abbbe18ba1710dfd4a31af45769632255Jeff Brown * @param callback The callback interface in which to handle messages, or null. 187a2910d0abbbe18ba1710dfd4a31af45769632255Jeff Brown * @param async If true, the handler calls {@link Message#setAsynchronous(boolean)} for 188a2910d0abbbe18ba1710dfd4a31af45769632255Jeff Brown * each {@link Message} that is sent to it or {@link Runnable} that is posted to it. 189a2910d0abbbe18ba1710dfd4a31af45769632255Jeff Brown * 190a2910d0abbbe18ba1710dfd4a31af45769632255Jeff Brown * @hide 191a2910d0abbbe18ba1710dfd4a31af45769632255Jeff Brown */ 192a2910d0abbbe18ba1710dfd4a31af45769632255Jeff Brown public Handler(Callback callback, boolean async) { 1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (FIND_POTENTIAL_LEAKS) { 1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final Class<? extends Handler> klass = getClass(); 1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((klass.isAnonymousClass() || klass.isMemberClass() || klass.isLocalClass()) && 1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (klass.getModifiers() & Modifier.STATIC) == 0) { 1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.w(TAG, "The following Handler class should be static or leaks might occur: " + 1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project klass.getCanonicalName()); 1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLooper = Looper.myLooper(); 2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mLooper == null) { 2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new RuntimeException( 2058f07ee15cb678a86e1b8f0584a5c9ae29c8f46b8Eugene Susla "Can't create handler inside thread " + Thread.currentThread() 2068f07ee15cb678a86e1b8f0584a5c9ae29c8f46b8Eugene Susla + " that has not called Looper.prepare()"); 2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mQueue = mLooper.mQueue; 2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mCallback = callback; 210a2910d0abbbe18ba1710dfd4a31af45769632255Jeff Brown mAsynchronous = async; 211109025d778c12d78f8585920447320aaf0f1d2f8Jeff Brown } 212109025d778c12d78f8585920447320aaf0f1d2f8Jeff Brown 213109025d778c12d78f8585920447320aaf0f1d2f8Jeff Brown /** 214a2910d0abbbe18ba1710dfd4a31af45769632255Jeff Brown * Use the provided {@link Looper} instead of the default one and take a callback 215109025d778c12d78f8585920447320aaf0f1d2f8Jeff Brown * interface in which to handle messages. Also set whether the handler 216109025d778c12d78f8585920447320aaf0f1d2f8Jeff Brown * should be asynchronous. 217109025d778c12d78f8585920447320aaf0f1d2f8Jeff Brown * 218109025d778c12d78f8585920447320aaf0f1d2f8Jeff Brown * Handlers are synchronous by default unless this constructor is used to make 219109025d778c12d78f8585920447320aaf0f1d2f8Jeff Brown * one that is strictly asynchronous. 220109025d778c12d78f8585920447320aaf0f1d2f8Jeff Brown * 221109025d778c12d78f8585920447320aaf0f1d2f8Jeff Brown * Asynchronous messages represent interrupts or events that do not require global ordering 2229840c07667bb0363c93fb8459e6c08f7e30d5df1Jeff Brown * with respect to synchronous messages. Asynchronous messages are not subject to 2238709ba863eeef0166a1ed2139aa066498eb42ba5Adam Powell * the synchronization barriers introduced by conditions such as display vsync. 224109025d778c12d78f8585920447320aaf0f1d2f8Jeff Brown * 225a2910d0abbbe18ba1710dfd4a31af45769632255Jeff Brown * @param looper The looper, must not be null. 226a2910d0abbbe18ba1710dfd4a31af45769632255Jeff Brown * @param callback The callback interface in which to handle messages, or null. 227109025d778c12d78f8585920447320aaf0f1d2f8Jeff Brown * @param async If true, the handler calls {@link Message#setAsynchronous(boolean)} for 228109025d778c12d78f8585920447320aaf0f1d2f8Jeff Brown * each {@link Message} that is sent to it or {@link Runnable} that is posted to it. 229109025d778c12d78f8585920447320aaf0f1d2f8Jeff Brown * 230109025d778c12d78f8585920447320aaf0f1d2f8Jeff Brown * @hide 231109025d778c12d78f8585920447320aaf0f1d2f8Jeff Brown */ 232109025d778c12d78f8585920447320aaf0f1d2f8Jeff Brown public Handler(Looper looper, Callback callback, boolean async) { 233109025d778c12d78f8585920447320aaf0f1d2f8Jeff Brown mLooper = looper; 234109025d778c12d78f8585920447320aaf0f1d2f8Jeff Brown mQueue = looper.mQueue; 235109025d778c12d78f8585920447320aaf0f1d2f8Jeff Brown mCallback = callback; 236109025d778c12d78f8585920447320aaf0f1d2f8Jeff Brown mAsynchronous = async; 2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2398709ba863eeef0166a1ed2139aa066498eb42ba5Adam Powell /** 2408709ba863eeef0166a1ed2139aa066498eb42ba5Adam Powell * Create a new Handler whose posted messages and runnables are not subject to 2418709ba863eeef0166a1ed2139aa066498eb42ba5Adam Powell * synchronization barriers such as display vsync. 2428709ba863eeef0166a1ed2139aa066498eb42ba5Adam Powell * 2438709ba863eeef0166a1ed2139aa066498eb42ba5Adam Powell * <p>Messages sent to an async handler are guaranteed to be ordered with respect to one another, 2448709ba863eeef0166a1ed2139aa066498eb42ba5Adam Powell * but not necessarily with respect to messages from other Handlers.</p> 2458709ba863eeef0166a1ed2139aa066498eb42ba5Adam Powell * 2468709ba863eeef0166a1ed2139aa066498eb42ba5Adam Powell * @see #createAsync(Looper, Callback) to create an async Handler with custom message handling. 2478709ba863eeef0166a1ed2139aa066498eb42ba5Adam Powell * 2488709ba863eeef0166a1ed2139aa066498eb42ba5Adam Powell * @param looper the Looper that the new Handler should be bound to 2498709ba863eeef0166a1ed2139aa066498eb42ba5Adam Powell * @return a new async Handler instance 2508709ba863eeef0166a1ed2139aa066498eb42ba5Adam Powell */ 2518709ba863eeef0166a1ed2139aa066498eb42ba5Adam Powell @NonNull 2528709ba863eeef0166a1ed2139aa066498eb42ba5Adam Powell public static Handler createAsync(@NonNull Looper looper) { 2538709ba863eeef0166a1ed2139aa066498eb42ba5Adam Powell if (looper == null) throw new NullPointerException("looper must not be null"); 2548709ba863eeef0166a1ed2139aa066498eb42ba5Adam Powell return new Handler(looper, null, true); 2558709ba863eeef0166a1ed2139aa066498eb42ba5Adam Powell } 2568709ba863eeef0166a1ed2139aa066498eb42ba5Adam Powell 2578709ba863eeef0166a1ed2139aa066498eb42ba5Adam Powell /** 2588709ba863eeef0166a1ed2139aa066498eb42ba5Adam Powell * Create a new Handler whose posted messages and runnables are not subject to 2598709ba863eeef0166a1ed2139aa066498eb42ba5Adam Powell * synchronization barriers such as display vsync. 2608709ba863eeef0166a1ed2139aa066498eb42ba5Adam Powell * 2618709ba863eeef0166a1ed2139aa066498eb42ba5Adam Powell * <p>Messages sent to an async handler are guaranteed to be ordered with respect to one another, 2628709ba863eeef0166a1ed2139aa066498eb42ba5Adam Powell * but not necessarily with respect to messages from other Handlers.</p> 2638709ba863eeef0166a1ed2139aa066498eb42ba5Adam Powell * 2648709ba863eeef0166a1ed2139aa066498eb42ba5Adam Powell * @see #createAsync(Looper) to create an async Handler without custom message handling. 2658709ba863eeef0166a1ed2139aa066498eb42ba5Adam Powell * 2668709ba863eeef0166a1ed2139aa066498eb42ba5Adam Powell * @param looper the Looper that the new Handler should be bound to 2678709ba863eeef0166a1ed2139aa066498eb42ba5Adam Powell * @return a new async Handler instance 2688709ba863eeef0166a1ed2139aa066498eb42ba5Adam Powell */ 2698709ba863eeef0166a1ed2139aa066498eb42ba5Adam Powell @NonNull 2708709ba863eeef0166a1ed2139aa066498eb42ba5Adam Powell public static Handler createAsync(@NonNull Looper looper, @NonNull Callback callback) { 2718709ba863eeef0166a1ed2139aa066498eb42ba5Adam Powell if (looper == null) throw new NullPointerException("looper must not be null"); 2728709ba863eeef0166a1ed2139aa066498eb42ba5Adam Powell if (callback == null) throw new NullPointerException("callback must not be null"); 2738709ba863eeef0166a1ed2139aa066498eb42ba5Adam Powell return new Handler(looper, callback, true); 2748709ba863eeef0166a1ed2139aa066498eb42ba5Adam Powell } 2758709ba863eeef0166a1ed2139aa066498eb42ba5Adam Powell 276a38fbf63fd2a29884637a59387643c801ed4f663Eugene Susla /** @hide */ 277a38fbf63fd2a29884637a59387643c801ed4f663Eugene Susla @NonNull 278a38fbf63fd2a29884637a59387643c801ed4f663Eugene Susla public static Handler getMain() { 279a38fbf63fd2a29884637a59387643c801ed4f663Eugene Susla if (MAIN_THREAD_HANDLER == null) { 280a38fbf63fd2a29884637a59387643c801ed4f663Eugene Susla MAIN_THREAD_HANDLER = new Handler(Looper.getMainLooper()); 281a38fbf63fd2a29884637a59387643c801ed4f663Eugene Susla } 282a38fbf63fd2a29884637a59387643c801ed4f663Eugene Susla return MAIN_THREAD_HANDLER; 283a38fbf63fd2a29884637a59387643c801ed4f663Eugene Susla } 284a38fbf63fd2a29884637a59387643c801ed4f663Eugene Susla 285a38fbf63fd2a29884637a59387643c801ed4f663Eugene Susla /** @hide */ 286a38fbf63fd2a29884637a59387643c801ed4f663Eugene Susla @NonNull 287a38fbf63fd2a29884637a59387643c801ed4f663Eugene Susla public static Handler mainIfNull(@Nullable Handler handler) { 288a38fbf63fd2a29884637a59387643c801ed4f663Eugene Susla return handler == null ? getMain() : handler; 289a38fbf63fd2a29884637a59387643c801ed4f663Eugene Susla } 290a38fbf63fd2a29884637a59387643c801ed4f663Eugene Susla 29174cd3de6f4889d54a3da930de5e7ad00b97f03e9Jeff Sharkey /** {@hide} */ 29274cd3de6f4889d54a3da930de5e7ad00b97f03e9Jeff Sharkey public String getTraceName(Message message) { 29374cd3de6f4889d54a3da930de5e7ad00b97f03e9Jeff Sharkey final StringBuilder sb = new StringBuilder(); 29474cd3de6f4889d54a3da930de5e7ad00b97f03e9Jeff Sharkey sb.append(getClass().getName()).append(": "); 29574cd3de6f4889d54a3da930de5e7ad00b97f03e9Jeff Sharkey if (message.callback != null) { 29674cd3de6f4889d54a3da930de5e7ad00b97f03e9Jeff Sharkey sb.append(message.callback.getClass().getName()); 29774cd3de6f4889d54a3da930de5e7ad00b97f03e9Jeff Sharkey } else { 29874cd3de6f4889d54a3da930de5e7ad00b97f03e9Jeff Sharkey sb.append("#").append(message.what); 29974cd3de6f4889d54a3da930de5e7ad00b97f03e9Jeff Sharkey } 30074cd3de6f4889d54a3da930de5e7ad00b97f03e9Jeff Sharkey return sb.toString(); 30174cd3de6f4889d54a3da930de5e7ad00b97f03e9Jeff Sharkey } 30274cd3de6f4889d54a3da930de5e7ad00b97f03e9Jeff Sharkey 3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 304f9284695e8c10dad4daf3d2c84f607483bcb56caRomain Guy * Returns a string representing the name of the specified message. 305f9284695e8c10dad4daf3d2c84f607483bcb56caRomain Guy * The default implementation will either return the class name of the 306f9284695e8c10dad4daf3d2c84f607483bcb56caRomain Guy * message callback if any, or the hexadecimal representation of the 307f9284695e8c10dad4daf3d2c84f607483bcb56caRomain Guy * message "what" field. 308f9284695e8c10dad4daf3d2c84f607483bcb56caRomain Guy * 309f9284695e8c10dad4daf3d2c84f607483bcb56caRomain Guy * @param message The message whose name is being queried 310f9284695e8c10dad4daf3d2c84f607483bcb56caRomain Guy */ 311f9284695e8c10dad4daf3d2c84f607483bcb56caRomain Guy public String getMessageName(Message message) { 312f9284695e8c10dad4daf3d2c84f607483bcb56caRomain Guy if (message.callback != null) { 313f9284695e8c10dad4daf3d2c84f607483bcb56caRomain Guy return message.callback.getClass().getName(); 314f9284695e8c10dad4daf3d2c84f607483bcb56caRomain Guy } 315f9284695e8c10dad4daf3d2c84f607483bcb56caRomain Guy return "0x" + Integer.toHexString(message.what); 316f9284695e8c10dad4daf3d2c84f607483bcb56caRomain Guy } 317f9284695e8c10dad4daf3d2c84f607483bcb56caRomain Guy 318f9284695e8c10dad4daf3d2c84f607483bcb56caRomain Guy /** 3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Returns a new {@link android.os.Message Message} from the global message pool. More efficient than 3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * creating and allocating new instances. The retrieved message has its handler set to this instance (Message.target == this). 3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * If you don't want that facility, just call Message.obtain() instead. 3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final Message obtainMessage() 3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return Message.obtain(this); 3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Same as {@link #obtainMessage()}, except that it also sets the what member of the returned Message. 3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param what Value to assign to the returned Message.what field. 3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return A Message from the global message pool. 3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final Message obtainMessage(int what) 3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return Message.obtain(this, what); 3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Same as {@link #obtainMessage()}, except that it also sets the what and obj members 3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * of the returned Message. 3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param what Value to assign to the returned Message.what field. 3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param obj Value to assign to the returned Message.obj field. 3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return A Message from the global message pool. 3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final Message obtainMessage(int what, Object obj) 3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return Message.obtain(this, what, obj); 3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Same as {@link #obtainMessage()}, except that it also sets the what, arg1 and arg2 members of the returned 3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Message. 3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param what Value to assign to the returned Message.what field. 3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param arg1 Value to assign to the returned Message.arg1 field. 3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param arg2 Value to assign to the returned Message.arg2 field. 3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return A Message from the global message pool. 3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final Message obtainMessage(int what, int arg1, int arg2) 3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return Message.obtain(this, what, arg1, arg2); 3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Same as {@link #obtainMessage()}, except that it also sets the what, obj, arg1,and arg2 values on the 3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * returned Message. 3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param what Value to assign to the returned Message.what field. 3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param arg1 Value to assign to the returned Message.arg1 field. 3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param arg2 Value to assign to the returned Message.arg2 field. 3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param obj Value to assign to the returned Message.obj field. 3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return A Message from the global message pool. 3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final Message obtainMessage(int what, int arg1, int arg2, Object obj) 3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return Message.obtain(this, what, arg1, arg2, obj); 3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Causes the Runnable r to be added to the message queue. 3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The runnable will be run on the thread to which this handler is 3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * attached. 3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param r The Runnable that will be executed. 3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return Returns true if the Runnable was successfully placed in to the 3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * message queue. Returns false on failure, usually because the 3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * looper processing the message queue is exiting. 3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final boolean post(Runnable r) 3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return sendMessageDelayed(getPostMessage(r), 0); 3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Causes the Runnable r to be added to the message queue, to be run 4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * at a specific time given by <var>uptimeMillis</var>. 4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <b>The time-base is {@link android.os.SystemClock#uptimeMillis}.</b> 402a8cf4f2fd1f72e3fa6ded96e1516ea1788fe3a25David Christie * Time spent in deep sleep will add an additional delay to execution. 4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The runnable will be run on the thread to which this handler is attached. 4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param r The Runnable that will be executed. 4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param uptimeMillis The absolute time at which the callback should run, 4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * using the {@link android.os.SystemClock#uptimeMillis} time-base. 4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return Returns true if the Runnable was successfully placed in to the 4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * message queue. Returns false on failure, usually because the 4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * looper processing the message queue is exiting. Note that a 4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * result of true does not mean the Runnable will be processed -- if 4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the looper is quit before the delivery time of the message 4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * occurs then the message will be dropped. 4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final boolean postAtTime(Runnable r, long uptimeMillis) 4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return sendMessageAtTime(getPostMessage(r), uptimeMillis); 4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Causes the Runnable r to be added to the message queue, to be run 4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * at a specific time given by <var>uptimeMillis</var>. 4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <b>The time-base is {@link android.os.SystemClock#uptimeMillis}.</b> 425a8cf4f2fd1f72e3fa6ded96e1516ea1788fe3a25David Christie * Time spent in deep sleep will add an additional delay to execution. 4269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The runnable will be run on the thread to which this handler is attached. 4279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param r The Runnable that will be executed. 429820e3dd74a4a1db0784cf03c553090c31b111638Jake Wharton * @param token An instance which can be used to cancel {@code r} via 430820e3dd74a4a1db0784cf03c553090c31b111638Jake Wharton * {@link #removeCallbacksAndMessages}. 4319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param uptimeMillis The absolute time at which the callback should run, 4329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * using the {@link android.os.SystemClock#uptimeMillis} time-base. 4339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return Returns true if the Runnable was successfully placed in to the 4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * message queue. Returns false on failure, usually because the 4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * looper processing the message queue is exiting. Note that a 4379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * result of true does not mean the Runnable will be processed -- if 4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the looper is quit before the delivery time of the message 4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * occurs then the message will be dropped. 4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see android.os.SystemClock#uptimeMillis 4429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final boolean postAtTime(Runnable r, Object token, long uptimeMillis) 4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 4459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return sendMessageAtTime(getPostMessage(r, token), uptimeMillis); 4469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Causes the Runnable r to be added to the message queue, to be run 4509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * after the specified amount of time elapses. 4519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The runnable will be run on the thread to which this handler 4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * is attached. 453a8cf4f2fd1f72e3fa6ded96e1516ea1788fe3a25David Christie * <b>The time-base is {@link android.os.SystemClock#uptimeMillis}.</b> 454a8cf4f2fd1f72e3fa6ded96e1516ea1788fe3a25David Christie * Time spent in deep sleep will add an additional delay to execution. 4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param r The Runnable that will be executed. 4579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param delayMillis The delay (in milliseconds) until the Runnable 4589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * will be executed. 4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return Returns true if the Runnable was successfully placed in to the 4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * message queue. Returns false on failure, usually because the 4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * looper processing the message queue is exiting. Note that a 4639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * result of true does not mean the Runnable will be processed -- 4649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * if the looper is quit before the delivery time of the message 4659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * occurs then the message will be dropped. 4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final boolean postDelayed(Runnable r, long delayMillis) 4689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 4699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return sendMessageDelayed(getPostMessage(r), delayMillis); 4709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 473820e3dd74a4a1db0784cf03c553090c31b111638Jake Wharton * Causes the Runnable r to be added to the message queue, to be run 474820e3dd74a4a1db0784cf03c553090c31b111638Jake Wharton * after the specified amount of time elapses. 475820e3dd74a4a1db0784cf03c553090c31b111638Jake Wharton * The runnable will be run on the thread to which this handler 476820e3dd74a4a1db0784cf03c553090c31b111638Jake Wharton * is attached. 477820e3dd74a4a1db0784cf03c553090c31b111638Jake Wharton * <b>The time-base is {@link android.os.SystemClock#uptimeMillis}.</b> 478820e3dd74a4a1db0784cf03c553090c31b111638Jake Wharton * Time spent in deep sleep will add an additional delay to execution. 479820e3dd74a4a1db0784cf03c553090c31b111638Jake Wharton * 480820e3dd74a4a1db0784cf03c553090c31b111638Jake Wharton * @param r The Runnable that will be executed. 481820e3dd74a4a1db0784cf03c553090c31b111638Jake Wharton * @param token An instance which can be used to cancel {@code r} via 482820e3dd74a4a1db0784cf03c553090c31b111638Jake Wharton * {@link #removeCallbacksAndMessages}. 483820e3dd74a4a1db0784cf03c553090c31b111638Jake Wharton * @param delayMillis The delay (in milliseconds) until the Runnable 484820e3dd74a4a1db0784cf03c553090c31b111638Jake Wharton * will be executed. 485820e3dd74a4a1db0784cf03c553090c31b111638Jake Wharton * 486820e3dd74a4a1db0784cf03c553090c31b111638Jake Wharton * @return Returns true if the Runnable was successfully placed in to the 487820e3dd74a4a1db0784cf03c553090c31b111638Jake Wharton * message queue. Returns false on failure, usually because the 488820e3dd74a4a1db0784cf03c553090c31b111638Jake Wharton * looper processing the message queue is exiting. Note that a 489820e3dd74a4a1db0784cf03c553090c31b111638Jake Wharton * result of true does not mean the Runnable will be processed -- 490820e3dd74a4a1db0784cf03c553090c31b111638Jake Wharton * if the looper is quit before the delivery time of the message 491820e3dd74a4a1db0784cf03c553090c31b111638Jake Wharton * occurs then the message will be dropped. 492820e3dd74a4a1db0784cf03c553090c31b111638Jake Wharton */ 493820e3dd74a4a1db0784cf03c553090c31b111638Jake Wharton public final boolean postDelayed(Runnable r, Object token, long delayMillis) 494820e3dd74a4a1db0784cf03c553090c31b111638Jake Wharton { 495820e3dd74a4a1db0784cf03c553090c31b111638Jake Wharton return sendMessageDelayed(getPostMessage(r, token), delayMillis); 496820e3dd74a4a1db0784cf03c553090c31b111638Jake Wharton } 497820e3dd74a4a1db0784cf03c553090c31b111638Jake Wharton 498820e3dd74a4a1db0784cf03c553090c31b111638Jake Wharton /** 4999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Posts a message to an object that implements Runnable. 5009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Causes the Runnable r to executed on the next iteration through the 5019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * message queue. The runnable will be run on the thread to which this 5029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * handler is attached. 5039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <b>This method is only for use in very special circumstances -- it 5049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * can easily starve the message queue, cause ordering problems, or have 5059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * other unexpected side-effects.</b> 5069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 5079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param r The Runnable that will be executed. 5089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 5099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return Returns true if the message was successfully placed in to the 5109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * message queue. Returns false on failure, usually because the 5119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * looper processing the message queue is exiting. 5129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final boolean postAtFrontOfQueue(Runnable r) 5149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 5159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return sendMessageAtFrontOfQueue(getPostMessage(r)); 5169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 519c53abc4d42a707caddf7ec9bb7d041125a09dbd7Jeff Brown * Runs the specified task synchronously. 5208b60e4514702edd1eb4b6f2bfc027e04a94369c0Jeff Brown * <p> 521c53abc4d42a707caddf7ec9bb7d041125a09dbd7Jeff Brown * If the current thread is the same as the handler thread, then the runnable 522c53abc4d42a707caddf7ec9bb7d041125a09dbd7Jeff Brown * runs immediately without being enqueued. Otherwise, posts the runnable 523c53abc4d42a707caddf7ec9bb7d041125a09dbd7Jeff Brown * to the handler and waits for it to complete before returning. 5248b60e4514702edd1eb4b6f2bfc027e04a94369c0Jeff Brown * </p><p> 525c53abc4d42a707caddf7ec9bb7d041125a09dbd7Jeff Brown * This method is dangerous! Improper use can result in deadlocks. 526c53abc4d42a707caddf7ec9bb7d041125a09dbd7Jeff Brown * Never call this method while any locks are held or use it in a 527c53abc4d42a707caddf7ec9bb7d041125a09dbd7Jeff Brown * possibly re-entrant manner. 5288b60e4514702edd1eb4b6f2bfc027e04a94369c0Jeff Brown * </p><p> 529c53abc4d42a707caddf7ec9bb7d041125a09dbd7Jeff Brown * This method is occasionally useful in situations where a background thread 530c53abc4d42a707caddf7ec9bb7d041125a09dbd7Jeff Brown * must synchronously await completion of a task that must run on the 531c53abc4d42a707caddf7ec9bb7d041125a09dbd7Jeff Brown * handler's thread. However, this problem is often a symptom of bad design. 532c53abc4d42a707caddf7ec9bb7d041125a09dbd7Jeff Brown * Consider improving the design (if possible) before resorting to this method. 5338b60e4514702edd1eb4b6f2bfc027e04a94369c0Jeff Brown * </p><p> 534c53abc4d42a707caddf7ec9bb7d041125a09dbd7Jeff Brown * One example of where you might want to use this method is when you just 535c53abc4d42a707caddf7ec9bb7d041125a09dbd7Jeff Brown * set up a Handler thread and need to perform some initialization steps on 536c53abc4d42a707caddf7ec9bb7d041125a09dbd7Jeff Brown * it before continuing execution. 5378b60e4514702edd1eb4b6f2bfc027e04a94369c0Jeff Brown * </p><p> 5384ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown * If timeout occurs then this method returns <code>false</code> but the runnable 5394ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown * will remain posted on the handler and may already be in progress or 5404ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown * complete at a later time. 5418b60e4514702edd1eb4b6f2bfc027e04a94369c0Jeff Brown * </p><p> 5428b60e4514702edd1eb4b6f2bfc027e04a94369c0Jeff Brown * When using this method, be sure to use {@link Looper#quitSafely} when 5438b60e4514702edd1eb4b6f2bfc027e04a94369c0Jeff Brown * quitting the looper. Otherwise {@link #runWithScissors} may hang indefinitely. 5448b60e4514702edd1eb4b6f2bfc027e04a94369c0Jeff Brown * (TODO: We should fix this by making MessageQueue aware of blocking runnables.) 5458b60e4514702edd1eb4b6f2bfc027e04a94369c0Jeff Brown * </p> 5464ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown * 547c53abc4d42a707caddf7ec9bb7d041125a09dbd7Jeff Brown * @param r The Runnable that will be executed synchronously. 5484ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown * @param timeout The timeout in milliseconds, or 0 to wait indefinitely. 549c53abc4d42a707caddf7ec9bb7d041125a09dbd7Jeff Brown * 550c53abc4d42a707caddf7ec9bb7d041125a09dbd7Jeff Brown * @return Returns true if the Runnable was successfully executed. 551c53abc4d42a707caddf7ec9bb7d041125a09dbd7Jeff Brown * Returns false on failure, usually because the 552c53abc4d42a707caddf7ec9bb7d041125a09dbd7Jeff Brown * looper processing the message queue is exiting. 553c53abc4d42a707caddf7ec9bb7d041125a09dbd7Jeff Brown * 554c53abc4d42a707caddf7ec9bb7d041125a09dbd7Jeff Brown * @hide This method is prone to abuse and should probably not be in the API. 555c53abc4d42a707caddf7ec9bb7d041125a09dbd7Jeff Brown * If we ever do make it part of the API, we might want to rename it to something 556c53abc4d42a707caddf7ec9bb7d041125a09dbd7Jeff Brown * less funny like runUnsafe(). 557c53abc4d42a707caddf7ec9bb7d041125a09dbd7Jeff Brown */ 5584ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown public final boolean runWithScissors(final Runnable r, long timeout) { 559c53abc4d42a707caddf7ec9bb7d041125a09dbd7Jeff Brown if (r == null) { 560c53abc4d42a707caddf7ec9bb7d041125a09dbd7Jeff Brown throw new IllegalArgumentException("runnable must not be null"); 561c53abc4d42a707caddf7ec9bb7d041125a09dbd7Jeff Brown } 5624ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown if (timeout < 0) { 5634ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown throw new IllegalArgumentException("timeout must be non-negative"); 5644ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown } 565c53abc4d42a707caddf7ec9bb7d041125a09dbd7Jeff Brown 566c53abc4d42a707caddf7ec9bb7d041125a09dbd7Jeff Brown if (Looper.myLooper() == mLooper) { 567c53abc4d42a707caddf7ec9bb7d041125a09dbd7Jeff Brown r.run(); 568c53abc4d42a707caddf7ec9bb7d041125a09dbd7Jeff Brown return true; 569c53abc4d42a707caddf7ec9bb7d041125a09dbd7Jeff Brown } 570c53abc4d42a707caddf7ec9bb7d041125a09dbd7Jeff Brown 571c53abc4d42a707caddf7ec9bb7d041125a09dbd7Jeff Brown BlockingRunnable br = new BlockingRunnable(r); 5724ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown return br.postAndWait(this, timeout); 573c53abc4d42a707caddf7ec9bb7d041125a09dbd7Jeff Brown } 574c53abc4d42a707caddf7ec9bb7d041125a09dbd7Jeff Brown 575c53abc4d42a707caddf7ec9bb7d041125a09dbd7Jeff Brown /** 5769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Remove any pending posts of Runnable r that are in the message queue. 5779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final void removeCallbacks(Runnable r) 5799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 5809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mQueue.removeMessages(this, r, null); 5819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Remove any pending posts of Runnable <var>r</var> with Object 585466ed24810d329add4f9200edf8c1918a3e80716Dianne Hackborn * <var>token</var> that are in the message queue. If <var>token</var> is null, 586466ed24810d329add4f9200edf8c1918a3e80716Dianne Hackborn * all callbacks will be removed. 5879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final void removeCallbacks(Runnable r, Object token) 5899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 5909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mQueue.removeMessages(this, r, token); 5919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 5949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Pushes a message onto the end of the message queue after all pending messages 5959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * before the current time. It will be received in {@link #handleMessage}, 5969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * in the thread attached to this handler. 5979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 5989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return Returns true if the message was successfully placed in to the 5999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * message queue. Returns false on failure, usually because the 6009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * looper processing the message queue is exiting. 6019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 6029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final boolean sendMessage(Message msg) 6039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 6049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return sendMessageDelayed(msg, 0); 6059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 6089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Sends a Message containing only the what value. 6099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 6109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return Returns true if the message was successfully placed in to the 6119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * message queue. Returns false on failure, usually because the 6129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * looper processing the message queue is exiting. 6139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 6149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final boolean sendEmptyMessage(int what) 6159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 6169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return sendEmptyMessageDelayed(what, 0); 6179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 6209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Sends a Message containing only the what value, to be delivered 6219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * after the specified amount of time elapses. 6229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #sendMessageDelayed(android.os.Message, long) 6239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 6249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return Returns true if the message was successfully placed in to the 6259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * message queue. Returns false on failure, usually because the 6269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * looper processing the message queue is exiting. 6279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 6289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final boolean sendEmptyMessageDelayed(int what, long delayMillis) { 6299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Message msg = Message.obtain(); 6309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project msg.what = what; 6319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return sendMessageDelayed(msg, delayMillis); 6329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 6359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Sends a Message containing only the what value, to be delivered 6369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * at a specific time. 6379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #sendMessageAtTime(android.os.Message, long) 6389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 6399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return Returns true if the message was successfully placed in to the 6409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * message queue. Returns false on failure, usually because the 6419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * looper processing the message queue is exiting. 6429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 6439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final boolean sendEmptyMessageAtTime(int what, long uptimeMillis) { 6459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Message msg = Message.obtain(); 6469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project msg.what = what; 6479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return sendMessageAtTime(msg, uptimeMillis); 6489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 6519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Enqueue a message into the message queue after all pending messages 6529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * before (current time + delayMillis). You will receive it in 6539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #handleMessage}, in the thread attached to this handler. 6549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 6559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return Returns true if the message was successfully placed in to the 6569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * message queue. Returns false on failure, usually because the 6579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * looper processing the message queue is exiting. Note that a 6589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * result of true does not mean the message will be processed -- if 6599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the looper is quit before the delivery time of the message 6609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * occurs then the message will be dropped. 6619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 6629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final boolean sendMessageDelayed(Message msg, long delayMillis) 6639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 6649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (delayMillis < 0) { 6659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project delayMillis = 0; 6669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return sendMessageAtTime(msg, SystemClock.uptimeMillis() + delayMillis); 6689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 6719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Enqueue a message into the message queue after all pending messages 6729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * before the absolute time (in milliseconds) <var>uptimeMillis</var>. 6739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <b>The time-base is {@link android.os.SystemClock#uptimeMillis}.</b> 674a8cf4f2fd1f72e3fa6ded96e1516ea1788fe3a25David Christie * Time spent in deep sleep will add an additional delay to execution. 6759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You will receive it in {@link #handleMessage}, in the thread attached 6769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * to this handler. 6779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 6789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param uptimeMillis The absolute time at which the message should be 6799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * delivered, using the 6809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.os.SystemClock#uptimeMillis} time-base. 6819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 6829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return Returns true if the message was successfully placed in to the 6839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * message queue. Returns false on failure, usually because the 6849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * looper processing the message queue is exiting. Note that a 6859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * result of true does not mean the message will be processed -- if 6869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the looper is quit before the delivery time of the message 6879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * occurs then the message will be dropped. 6889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 689109025d778c12d78f8585920447320aaf0f1d2f8Jeff Brown public boolean sendMessageAtTime(Message msg, long uptimeMillis) { 6909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project MessageQueue queue = mQueue; 691109025d778c12d78f8585920447320aaf0f1d2f8Jeff Brown if (queue == null) { 6929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project RuntimeException e = new RuntimeException( 693109025d778c12d78f8585920447320aaf0f1d2f8Jeff Brown this + " sendMessageAtTime() called with no mQueue"); 6949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.w("Looper", e.getMessage(), e); 695109025d778c12d78f8585920447320aaf0f1d2f8Jeff Brown return false; 6969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 697109025d778c12d78f8585920447320aaf0f1d2f8Jeff Brown return enqueueMessage(queue, msg, uptimeMillis); 6989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 7019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Enqueue a message at the front of the message queue, to be processed on 7029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the next iteration of the message loop. You will receive it in 7039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #handleMessage}, in the thread attached to this handler. 7049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <b>This method is only for use in very special circumstances -- it 7059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * can easily starve the message queue, cause ordering problems, or have 7069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * other unexpected side-effects.</b> 7079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 7089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return Returns true if the message was successfully placed in to the 7099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * message queue. Returns false on failure, usually because the 7109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * looper processing the message queue is exiting. 7119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 712109025d778c12d78f8585920447320aaf0f1d2f8Jeff Brown public final boolean sendMessageAtFrontOfQueue(Message msg) { 7139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project MessageQueue queue = mQueue; 714109025d778c12d78f8585920447320aaf0f1d2f8Jeff Brown if (queue == null) { 7159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project RuntimeException e = new RuntimeException( 7169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this + " sendMessageAtTime() called with no mQueue"); 7179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.w("Looper", e.getMessage(), e); 718109025d778c12d78f8585920447320aaf0f1d2f8Jeff Brown return false; 719109025d778c12d78f8585920447320aaf0f1d2f8Jeff Brown } 720109025d778c12d78f8585920447320aaf0f1d2f8Jeff Brown return enqueueMessage(queue, msg, 0); 721109025d778c12d78f8585920447320aaf0f1d2f8Jeff Brown } 722109025d778c12d78f8585920447320aaf0f1d2f8Jeff Brown 7239f35ca996432e960b77eb194975e2086d7c18affEugene Susla /** 7249f35ca996432e960b77eb194975e2086d7c18affEugene Susla * Executes the message synchronously if called on the same thread this handler corresponds to, 7259f35ca996432e960b77eb194975e2086d7c18affEugene Susla * or {@link #sendMessage pushes it to the queue} otherwise 7269f35ca996432e960b77eb194975e2086d7c18affEugene Susla * 7279f35ca996432e960b77eb194975e2086d7c18affEugene Susla * @return Returns true if the message was successfully ran or placed in to the 7289f35ca996432e960b77eb194975e2086d7c18affEugene Susla * message queue. Returns false on failure, usually because the 7299f35ca996432e960b77eb194975e2086d7c18affEugene Susla * looper processing the message queue is exiting. 7309f35ca996432e960b77eb194975e2086d7c18affEugene Susla * @hide 7319f35ca996432e960b77eb194975e2086d7c18affEugene Susla */ 7329f35ca996432e960b77eb194975e2086d7c18affEugene Susla public final boolean executeOrSendMessage(Message msg) { 7339f35ca996432e960b77eb194975e2086d7c18affEugene Susla if (mLooper == Looper.myLooper()) { 7349f35ca996432e960b77eb194975e2086d7c18affEugene Susla dispatchMessage(msg); 7359f35ca996432e960b77eb194975e2086d7c18affEugene Susla return true; 7369f35ca996432e960b77eb194975e2086d7c18affEugene Susla } 7379f35ca996432e960b77eb194975e2086d7c18affEugene Susla return sendMessage(msg); 7389f35ca996432e960b77eb194975e2086d7c18affEugene Susla } 7399f35ca996432e960b77eb194975e2086d7c18affEugene Susla 740109025d778c12d78f8585920447320aaf0f1d2f8Jeff Brown private boolean enqueueMessage(MessageQueue queue, Message msg, long uptimeMillis) { 741109025d778c12d78f8585920447320aaf0f1d2f8Jeff Brown msg.target = this; 742109025d778c12d78f8585920447320aaf0f1d2f8Jeff Brown if (mAsynchronous) { 743109025d778c12d78f8585920447320aaf0f1d2f8Jeff Brown msg.setAsynchronous(true); 7449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 745109025d778c12d78f8585920447320aaf0f1d2f8Jeff Brown return queue.enqueueMessage(msg, uptimeMillis); 7469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 7499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Remove any pending posts of messages with code 'what' that are in the 7509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * message queue. 7519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 7529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final void removeMessages(int what) { 7530f85ce3837633a03460a61405087a5d28a4bf955Jeff Brown mQueue.removeMessages(this, what, null); 7549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 7579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Remove any pending posts of messages with code 'what' and whose obj is 75832c8113510b2774f865e8ac763976b90d9db2706Jeff Brown * 'object' that are in the message queue. If <var>object</var> is null, 759466ed24810d329add4f9200edf8c1918a3e80716Dianne Hackborn * all messages will be removed. 7609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 7619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final void removeMessages(int what, Object object) { 7620f85ce3837633a03460a61405087a5d28a4bf955Jeff Brown mQueue.removeMessages(this, what, object); 7639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 7669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Remove any pending posts of callbacks and sent messages whose 767466ed24810d329add4f9200edf8c1918a3e80716Dianne Hackborn * <var>obj</var> is <var>token</var>. If <var>token</var> is null, 768466ed24810d329add4f9200edf8c1918a3e80716Dianne Hackborn * all callbacks and messages will be removed. 7699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 7709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final void removeCallbacksAndMessages(Object token) { 7719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mQueue.removeCallbacksAndMessages(this, token); 7729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 7759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Check if there are any pending posts of messages with code 'what' in 7769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the message queue. 7779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 7789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final boolean hasMessages(int what) { 7790f85ce3837633a03460a61405087a5d28a4bf955Jeff Brown return mQueue.hasMessages(this, what, null); 7809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 783cb01563d7efa5689abb98fe4e5d8cc86bfc2b6fcDianne Hackborn * Return whether there are any messages or callbacks currently scheduled on this handler. 784cb01563d7efa5689abb98fe4e5d8cc86bfc2b6fcDianne Hackborn * @hide 785cb01563d7efa5689abb98fe4e5d8cc86bfc2b6fcDianne Hackborn */ 786cb01563d7efa5689abb98fe4e5d8cc86bfc2b6fcDianne Hackborn public final boolean hasMessagesOrCallbacks() { 787cb01563d7efa5689abb98fe4e5d8cc86bfc2b6fcDianne Hackborn return mQueue.hasMessages(this); 788cb01563d7efa5689abb98fe4e5d8cc86bfc2b6fcDianne Hackborn } 789cb01563d7efa5689abb98fe4e5d8cc86bfc2b6fcDianne Hackborn 790cb01563d7efa5689abb98fe4e5d8cc86bfc2b6fcDianne Hackborn /** 7919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Check if there are any pending posts of messages with code 'what' and 7929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * whose obj is 'object' in the message queue. 7939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 7949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final boolean hasMessages(int what, Object object) { 7950f85ce3837633a03460a61405087a5d28a4bf955Jeff Brown return mQueue.hasMessages(this, what, object); 7969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 798ba6be8a62dcdb3ffd210cd36b9af4e3a658eac47Romain Guy /** 799ba6be8a62dcdb3ffd210cd36b9af4e3a658eac47Romain Guy * Check if there are any pending posts of messages with callback r in 800ba6be8a62dcdb3ffd210cd36b9af4e3a658eac47Romain Guy * the message queue. 801ba6be8a62dcdb3ffd210cd36b9af4e3a658eac47Romain Guy * 802ba6be8a62dcdb3ffd210cd36b9af4e3a658eac47Romain Guy * @hide 803ba6be8a62dcdb3ffd210cd36b9af4e3a658eac47Romain Guy */ 804ba6be8a62dcdb3ffd210cd36b9af4e3a658eac47Romain Guy public final boolean hasCallbacks(Runnable r) { 805ba6be8a62dcdb3ffd210cd36b9af4e3a658eac47Romain Guy return mQueue.hasMessages(this, r, null); 806ba6be8a62dcdb3ffd210cd36b9af4e3a658eac47Romain Guy } 807ba6be8a62dcdb3ffd210cd36b9af4e3a658eac47Romain Guy 8089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // if we can get rid of this method, the handler need not remember its loop 8099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // we could instead export a getMessageQueue() method... 8109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final Looper getLooper() { 8119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mLooper; 8129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final void dump(Printer pw, String prefix) { 8159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pw.println(prefix + this + " @ " + SystemClock.uptimeMillis()); 8169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mLooper == null) { 8179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pw.println(prefix + "looper uninitialized"); 8189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 8199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mLooper.dump(pw, prefix + " "); 8209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 823cb01563d7efa5689abb98fe4e5d8cc86bfc2b6fcDianne Hackborn /** 824cb01563d7efa5689abb98fe4e5d8cc86bfc2b6fcDianne Hackborn * @hide 825cb01563d7efa5689abb98fe4e5d8cc86bfc2b6fcDianne Hackborn */ 826cb01563d7efa5689abb98fe4e5d8cc86bfc2b6fcDianne Hackborn public final void dumpMine(Printer pw, String prefix) { 827cb01563d7efa5689abb98fe4e5d8cc86bfc2b6fcDianne Hackborn pw.println(prefix + this + " @ " + SystemClock.uptimeMillis()); 828cb01563d7efa5689abb98fe4e5d8cc86bfc2b6fcDianne Hackborn if (mLooper == null) { 829cb01563d7efa5689abb98fe4e5d8cc86bfc2b6fcDianne Hackborn pw.println(prefix + "looper uninitialized"); 830cb01563d7efa5689abb98fe4e5d8cc86bfc2b6fcDianne Hackborn } else { 831cb01563d7efa5689abb98fe4e5d8cc86bfc2b6fcDianne Hackborn mLooper.dump(pw, prefix + " ", this); 832cb01563d7efa5689abb98fe4e5d8cc86bfc2b6fcDianne Hackborn } 833cb01563d7efa5689abb98fe4e5d8cc86bfc2b6fcDianne Hackborn } 834cb01563d7efa5689abb98fe4e5d8cc86bfc2b6fcDianne Hackborn 8359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 8369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String toString() { 837588d8560b3fabcbc0d90c63f386b2fa0d56643deKristian Monsen return "Handler (" + getClass().getName() + ") {" 8389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + Integer.toHexString(System.identityHashCode(this)) 8399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + "}"; 8409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final IMessenger getIMessenger() { 8439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mQueue) { 8449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mMessenger != null) { 8459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mMessenger; 8469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mMessenger = new MessengerImpl(); 8489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mMessenger; 8499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 851333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick 8529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private final class MessengerImpl extends IMessenger.Stub { 8539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void send(Message msg) { 854cb3ed1dc287ddb9beb7c9186713426f5fba263c3Dianne Hackborn msg.sendingUid = Binder.getCallingUid(); 8559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Handler.this.sendMessage(msg); 8569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 858333b8cba996c8ebb8ca55ebfc5cc536bdd64af94Brad Fitzpatrick 859ba6be8a62dcdb3ffd210cd36b9af4e3a658eac47Romain Guy private static Message getPostMessage(Runnable r) { 8609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Message m = Message.obtain(); 8619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project m.callback = r; 8629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return m; 8639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 865ba6be8a62dcdb3ffd210cd36b9af4e3a658eac47Romain Guy private static Message getPostMessage(Runnable r, Object token) { 8669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Message m = Message.obtain(); 8679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project m.obj = token; 8689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project m.callback = r; 8699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return m; 8709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 872ba6be8a62dcdb3ffd210cd36b9af4e3a658eac47Romain Guy private static void handleCallback(Message message) { 8739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project message.callback.run(); 8749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final Looper mLooper; 87774cd3de6f4889d54a3da930de5e7ad00b97f03e9Jeff Sharkey final MessageQueue mQueue; 8789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final Callback mCallback; 879109025d778c12d78f8585920447320aaf0f1d2f8Jeff Brown final boolean mAsynchronous; 8809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IMessenger mMessenger; 881c53abc4d42a707caddf7ec9bb7d041125a09dbd7Jeff Brown 882c53abc4d42a707caddf7ec9bb7d041125a09dbd7Jeff Brown private static final class BlockingRunnable implements Runnable { 883c53abc4d42a707caddf7ec9bb7d041125a09dbd7Jeff Brown private final Runnable mTask; 884c53abc4d42a707caddf7ec9bb7d041125a09dbd7Jeff Brown private boolean mDone; 885c53abc4d42a707caddf7ec9bb7d041125a09dbd7Jeff Brown 886c53abc4d42a707caddf7ec9bb7d041125a09dbd7Jeff Brown public BlockingRunnable(Runnable task) { 887c53abc4d42a707caddf7ec9bb7d041125a09dbd7Jeff Brown mTask = task; 888c53abc4d42a707caddf7ec9bb7d041125a09dbd7Jeff Brown } 889c53abc4d42a707caddf7ec9bb7d041125a09dbd7Jeff Brown 890c53abc4d42a707caddf7ec9bb7d041125a09dbd7Jeff Brown @Override 891c53abc4d42a707caddf7ec9bb7d041125a09dbd7Jeff Brown public void run() { 892c53abc4d42a707caddf7ec9bb7d041125a09dbd7Jeff Brown try { 893c53abc4d42a707caddf7ec9bb7d041125a09dbd7Jeff Brown mTask.run(); 894c53abc4d42a707caddf7ec9bb7d041125a09dbd7Jeff Brown } finally { 895c53abc4d42a707caddf7ec9bb7d041125a09dbd7Jeff Brown synchronized (this) { 896c53abc4d42a707caddf7ec9bb7d041125a09dbd7Jeff Brown mDone = true; 897c53abc4d42a707caddf7ec9bb7d041125a09dbd7Jeff Brown notifyAll(); 898c53abc4d42a707caddf7ec9bb7d041125a09dbd7Jeff Brown } 899c53abc4d42a707caddf7ec9bb7d041125a09dbd7Jeff Brown } 900c53abc4d42a707caddf7ec9bb7d041125a09dbd7Jeff Brown } 901c53abc4d42a707caddf7ec9bb7d041125a09dbd7Jeff Brown 9024ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown public boolean postAndWait(Handler handler, long timeout) { 903c53abc4d42a707caddf7ec9bb7d041125a09dbd7Jeff Brown if (!handler.post(this)) { 904c53abc4d42a707caddf7ec9bb7d041125a09dbd7Jeff Brown return false; 905c53abc4d42a707caddf7ec9bb7d041125a09dbd7Jeff Brown } 906c53abc4d42a707caddf7ec9bb7d041125a09dbd7Jeff Brown 907c53abc4d42a707caddf7ec9bb7d041125a09dbd7Jeff Brown synchronized (this) { 9084ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown if (timeout > 0) { 9094ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown final long expirationTime = SystemClock.uptimeMillis() + timeout; 9104ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown while (!mDone) { 9114ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown long delay = expirationTime - SystemClock.uptimeMillis(); 9124ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown if (delay <= 0) { 9134ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown return false; // timeout 9144ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown } 9154ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown try { 9164ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown wait(delay); 9174ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown } catch (InterruptedException ex) { 9184ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown } 9194ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown } 9204ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown } else { 9214ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown while (!mDone) { 9224ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown try { 9234ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown wait(); 9244ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown } catch (InterruptedException ex) { 9254ed8fe75e1dde1a2b9576f3862aecc5a572c56b5Jeff Brown } 926c53abc4d42a707caddf7ec9bb7d041125a09dbd7Jeff Brown } 927c53abc4d42a707caddf7ec9bb7d041125a09dbd7Jeff Brown } 928c53abc4d42a707caddf7ec9bb7d041125a09dbd7Jeff Brown } 929c53abc4d42a707caddf7ec9bb7d041125a09dbd7Jeff Brown return true; 930c53abc4d42a707caddf7ec9bb7d041125a09dbd7Jeff Brown } 931c53abc4d42a707caddf7ec9bb7d041125a09dbd7Jeff Brown } 9329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 933