blob: 5c5e351d2eeb9a9f9071f76129cdd61a0e2b563f [file] [log] [blame]
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001/*
2 * Copyright (C) 2006 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package android.os;
18
Eugene Suslaa38fbf62017-03-14 10:26:10 -070019import android.annotation.NonNull;
20import android.annotation.Nullable;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080021import android.util.Log;
22import android.util.Printer;
23
24import java.lang.reflect.Modifier;
25
26/**
27 * A Handler allows you to send and process {@link Message} and Runnable
28 * objects associated with a thread's {@link MessageQueue}. Each Handler
29 * instance is associated with a single thread and that thread's message
30 * queue. When you create a new Handler, it is bound to the thread /
31 * message queue of the thread that is creating it -- from that point on,
32 * it will deliver messages and runnables to that message queue and execute
33 * them as they come out of the message queue.
34 *
35 * <p>There are two main uses for a Handler: (1) to schedule messages and
36 * runnables to be executed as some point in the future; and (2) to enqueue
37 * an action to be performed on a different thread than your own.
38 *
39 * <p>Scheduling messages is accomplished with the
40 * {@link #post}, {@link #postAtTime(Runnable, long)},
41 * {@link #postDelayed}, {@link #sendEmptyMessage},
42 * {@link #sendMessage}, {@link #sendMessageAtTime}, and
43 * {@link #sendMessageDelayed} methods. The <em>post</em> versions allow
44 * you to enqueue Runnable objects to be called by the message queue when
45 * they are received; the <em>sendMessage</em> versions allow you to enqueue
46 * a {@link Message} object containing a bundle of data that will be
47 * processed by the Handler's {@link #handleMessage} method (requiring that
48 * you implement a subclass of Handler).
49 *
50 * <p>When posting or sending to a Handler, you can either
51 * allow the item to be processed as soon as the message queue is ready
52 * to do so, or specify a delay before it gets processed or absolute time for
53 * it to be processed. The latter two allow you to implement timeouts,
54 * ticks, and other timing-based behavior.
55 *
56 * <p>When a
57 * process is created for your application, its main thread is dedicated to
58 * running a message queue that takes care of managing the top-level
59 * application objects (activities, broadcast receivers, etc) and any windows
60 * they create. You can create your own threads, and communicate back with
61 * the main application thread through a Handler. This is done by calling
62 * the same <em>post</em> or <em>sendMessage</em> methods as before, but from
Chris Palmer42855142010-09-09 17:04:31 -070063 * your new thread. The given Runnable or Message will then be scheduled
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080064 * in the Handler's message queue and processed when appropriate.
65 */
66public class Handler {
67 /*
68 * Set this flag to true to detect anonymous, local or member classes
69 * that extend this Handler class and that are not static. These kind
70 * of classes can potentially create leaks.
71 */
72 private static final boolean FIND_POTENTIAL_LEAKS = false;
73 private static final String TAG = "Handler";
Eugene Suslaa38fbf62017-03-14 10:26:10 -070074 private static Handler MAIN_THREAD_HANDLER = null;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080075
76 /**
77 * Callback interface you can use when instantiating a Handler to avoid
78 * having to implement your own subclass of Handler.
79 */
80 public interface Callback {
Pavel Grafovdcc53572017-03-10 19:39:14 +000081 /**
82 * @param msg A {@link android.os.Message Message} object
83 * @return True if no further handling is desired
84 */
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080085 public boolean handleMessage(Message msg);
86 }
87
88 /**
89 * Subclasses must implement this to receive messages.
90 */
91 public void handleMessage(Message msg) {
92 }
93
94 /**
95 * Handle system messages here.
96 */
97 public void dispatchMessage(Message msg) {
98 if (msg.callback != null) {
99 handleCallback(msg);
100 } else {
101 if (mCallback != null) {
102 if (mCallback.handleMessage(msg)) {
103 return;
104 }
105 }
106 handleMessage(msg);
107 }
108 }
109
110 /**
Jeff Browna2910d02012-08-25 12:29:46 -0700111 * Default constructor associates this handler with the {@link Looper} for the
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800112 * current thread.
113 *
Jeff Browna2910d02012-08-25 12:29:46 -0700114 * If this thread does not have a looper, this handler won't be able to receive messages
115 * so an exception is thrown.
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800116 */
117 public Handler() {
Jeff Browna2910d02012-08-25 12:29:46 -0700118 this(null, false);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800119 }
120
121 /**
Jeff Browna2910d02012-08-25 12:29:46 -0700122 * Constructor associates this handler with the {@link Looper} for the
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800123 * current thread and takes a callback interface in which you can handle
124 * messages.
Jeff Browna2910d02012-08-25 12:29:46 -0700125 *
126 * If this thread does not have a looper, this handler won't be able to receive messages
127 * so an exception is thrown.
128 *
129 * @param callback The callback interface in which to handle messages, or null.
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800130 */
131 public Handler(Callback callback) {
Jeff Browna2910d02012-08-25 12:29:46 -0700132 this(callback, false);
133 }
134
135 /**
136 * Use the provided {@link Looper} instead of the default one.
137 *
138 * @param looper The looper, must not be null.
139 */
140 public Handler(Looper looper) {
141 this(looper, null, false);
142 }
143
144 /**
145 * Use the provided {@link Looper} instead of the default one and take a callback
146 * interface in which to handle messages.
147 *
148 * @param looper The looper, must not be null.
149 * @param callback The callback interface in which to handle messages, or null.
150 */
151 public Handler(Looper looper, Callback callback) {
152 this(looper, callback, false);
153 }
154
155 /**
156 * Use the {@link Looper} for the current thread
157 * and set whether the handler should be asynchronous.
158 *
159 * Handlers are synchronous by default unless this constructor is used to make
160 * one that is strictly asynchronous.
161 *
162 * Asynchronous messages represent interrupts or events that do not require global ordering
Jeff Brown9840c072014-11-11 20:21:21 -0800163 * with respect to synchronous messages. Asynchronous messages are not subject to
Jeff Browna2910d02012-08-25 12:29:46 -0700164 * the synchronization barriers introduced by {@link MessageQueue#enqueueSyncBarrier(long)}.
165 *
166 * @param async If true, the handler calls {@link Message#setAsynchronous(boolean)} for
167 * each {@link Message} that is sent to it or {@link Runnable} that is posted to it.
168 *
169 * @hide
170 */
171 public Handler(boolean async) {
172 this(null, async);
173 }
174
175 /**
176 * Use the {@link Looper} for the current thread with the specified callback interface
177 * and set whether the handler should be asynchronous.
178 *
179 * Handlers are synchronous by default unless this constructor is used to make
180 * one that is strictly asynchronous.
181 *
182 * Asynchronous messages represent interrupts or events that do not require global ordering
Jeff Brown9840c072014-11-11 20:21:21 -0800183 * with respect to synchronous messages. Asynchronous messages are not subject to
Jeff Browna2910d02012-08-25 12:29:46 -0700184 * the synchronization barriers introduced by {@link MessageQueue#enqueueSyncBarrier(long)}.
185 *
186 * @param callback The callback interface in which to handle messages, or null.
187 * @param async If true, the handler calls {@link Message#setAsynchronous(boolean)} for
188 * each {@link Message} that is sent to it or {@link Runnable} that is posted to it.
189 *
190 * @hide
191 */
192 public Handler(Callback callback, boolean async) {
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800193 if (FIND_POTENTIAL_LEAKS) {
194 final Class<? extends Handler> klass = getClass();
195 if ((klass.isAnonymousClass() || klass.isMemberClass() || klass.isLocalClass()) &&
196 (klass.getModifiers() & Modifier.STATIC) == 0) {
197 Log.w(TAG, "The following Handler class should be static or leaks might occur: " +
198 klass.getCanonicalName());
199 }
200 }
201
202 mLooper = Looper.myLooper();
203 if (mLooper == null) {
204 throw new RuntimeException(
205 "Can't create handler inside thread that has not called Looper.prepare()");
206 }
207 mQueue = mLooper.mQueue;
208 mCallback = callback;
Jeff Browna2910d02012-08-25 12:29:46 -0700209 mAsynchronous = async;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800210 }
211
212 /**
Jeff Browna2910d02012-08-25 12:29:46 -0700213 * Use the provided {@link Looper} instead of the default one and take a callback
Jeff Brown109025d2012-08-14 20:41:30 -0700214 * interface in which to handle messages. Also set whether the handler
215 * should be asynchronous.
216 *
217 * Handlers are synchronous by default unless this constructor is used to make
218 * one that is strictly asynchronous.
219 *
220 * Asynchronous messages represent interrupts or events that do not require global ordering
Jeff Brown9840c072014-11-11 20:21:21 -0800221 * with respect to synchronous messages. Asynchronous messages are not subject to
Jeff Brown109025d2012-08-14 20:41:30 -0700222 * the synchronization barriers introduced by {@link MessageQueue#enqueueSyncBarrier(long)}.
223 *
Jeff Browna2910d02012-08-25 12:29:46 -0700224 * @param looper The looper, must not be null.
225 * @param callback The callback interface in which to handle messages, or null.
Jeff Brown109025d2012-08-14 20:41:30 -0700226 * @param async If true, the handler calls {@link Message#setAsynchronous(boolean)} for
227 * each {@link Message} that is sent to it or {@link Runnable} that is posted to it.
228 *
229 * @hide
230 */
231 public Handler(Looper looper, Callback callback, boolean async) {
232 mLooper = looper;
233 mQueue = looper.mQueue;
234 mCallback = callback;
235 mAsynchronous = async;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800236 }
237
Eugene Suslaa38fbf62017-03-14 10:26:10 -0700238 /** @hide */
239 @NonNull
240 public static Handler getMain() {
241 if (MAIN_THREAD_HANDLER == null) {
242 MAIN_THREAD_HANDLER = new Handler(Looper.getMainLooper());
243 }
244 return MAIN_THREAD_HANDLER;
245 }
246
247 /** @hide */
248 @NonNull
249 public static Handler mainIfNull(@Nullable Handler handler) {
250 return handler == null ? getMain() : handler;
251 }
252
Jeff Sharkey74cd3de2016-04-06 17:40:54 -0600253 /** {@hide} */
254 public String getTraceName(Message message) {
255 final StringBuilder sb = new StringBuilder();
256 sb.append(getClass().getName()).append(": ");
257 if (message.callback != null) {
258 sb.append(message.callback.getClass().getName());
259 } else {
260 sb.append("#").append(message.what);
261 }
262 return sb.toString();
263 }
264
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800265 /**
Romain Guyf9284692011-07-13 18:46:21 -0700266 * Returns a string representing the name of the specified message.
267 * The default implementation will either return the class name of the
268 * message callback if any, or the hexadecimal representation of the
269 * message "what" field.
270 *
271 * @param message The message whose name is being queried
272 */
273 public String getMessageName(Message message) {
274 if (message.callback != null) {
275 return message.callback.getClass().getName();
276 }
277 return "0x" + Integer.toHexString(message.what);
278 }
279
280 /**
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800281 * Returns a new {@link android.os.Message Message} from the global message pool. More efficient than
282 * creating and allocating new instances. The retrieved message has its handler set to this instance (Message.target == this).
283 * If you don't want that facility, just call Message.obtain() instead.
284 */
285 public final Message obtainMessage()
286 {
287 return Message.obtain(this);
288 }
289
290 /**
291 * Same as {@link #obtainMessage()}, except that it also sets the what member of the returned Message.
292 *
293 * @param what Value to assign to the returned Message.what field.
294 * @return A Message from the global message pool.
295 */
296 public final Message obtainMessage(int what)
297 {
298 return Message.obtain(this, what);
299 }
300
301 /**
302 *
303 * Same as {@link #obtainMessage()}, except that it also sets the what and obj members
304 * of the returned Message.
305 *
306 * @param what Value to assign to the returned Message.what field.
307 * @param obj Value to assign to the returned Message.obj field.
308 * @return A Message from the global message pool.
309 */
310 public final Message obtainMessage(int what, Object obj)
311 {
312 return Message.obtain(this, what, obj);
313 }
314
315 /**
316 *
317 * Same as {@link #obtainMessage()}, except that it also sets the what, arg1 and arg2 members of the returned
318 * Message.
319 * @param what Value to assign to the returned Message.what field.
320 * @param arg1 Value to assign to the returned Message.arg1 field.
321 * @param arg2 Value to assign to the returned Message.arg2 field.
322 * @return A Message from the global message pool.
323 */
324 public final Message obtainMessage(int what, int arg1, int arg2)
325 {
326 return Message.obtain(this, what, arg1, arg2);
327 }
328
329 /**
330 *
331 * Same as {@link #obtainMessage()}, except that it also sets the what, obj, arg1,and arg2 values on the
332 * returned Message.
333 * @param what Value to assign to the returned Message.what field.
334 * @param arg1 Value to assign to the returned Message.arg1 field.
335 * @param arg2 Value to assign to the returned Message.arg2 field.
336 * @param obj Value to assign to the returned Message.obj field.
337 * @return A Message from the global message pool.
338 */
339 public final Message obtainMessage(int what, int arg1, int arg2, Object obj)
340 {
341 return Message.obtain(this, what, arg1, arg2, obj);
342 }
343
344 /**
345 * Causes the Runnable r to be added to the message queue.
346 * The runnable will be run on the thread to which this handler is
347 * attached.
348 *
349 * @param r The Runnable that will be executed.
350 *
351 * @return Returns true if the Runnable was successfully placed in to the
352 * message queue. Returns false on failure, usually because the
353 * looper processing the message queue is exiting.
354 */
355 public final boolean post(Runnable r)
356 {
357 return sendMessageDelayed(getPostMessage(r), 0);
358 }
359
360 /**
361 * Causes the Runnable r to be added to the message queue, to be run
362 * at a specific time given by <var>uptimeMillis</var>.
363 * <b>The time-base is {@link android.os.SystemClock#uptimeMillis}.</b>
David Christiea8cf4f22013-12-19 18:30:06 -0800364 * Time spent in deep sleep will add an additional delay to execution.
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800365 * The runnable will be run on the thread to which this handler is attached.
366 *
367 * @param r The Runnable that will be executed.
368 * @param uptimeMillis The absolute time at which the callback should run,
369 * using the {@link android.os.SystemClock#uptimeMillis} time-base.
370 *
371 * @return Returns true if the Runnable was successfully placed in to the
372 * message queue. Returns false on failure, usually because the
373 * looper processing the message queue is exiting. Note that a
374 * result of true does not mean the Runnable will be processed -- if
375 * the looper is quit before the delivery time of the message
376 * occurs then the message will be dropped.
377 */
378 public final boolean postAtTime(Runnable r, long uptimeMillis)
379 {
380 return sendMessageAtTime(getPostMessage(r), uptimeMillis);
381 }
382
383 /**
384 * Causes the Runnable r to be added to the message queue, to be run
385 * at a specific time given by <var>uptimeMillis</var>.
386 * <b>The time-base is {@link android.os.SystemClock#uptimeMillis}.</b>
David Christiea8cf4f22013-12-19 18:30:06 -0800387 * Time spent in deep sleep will add an additional delay to execution.
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800388 * The runnable will be run on the thread to which this handler is attached.
389 *
390 * @param r The Runnable that will be executed.
Jake Wharton820e3dd2018-01-02 22:18:24 -0500391 * @param token An instance which can be used to cancel {@code r} via
392 * {@link #removeCallbacksAndMessages}.
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800393 * @param uptimeMillis The absolute time at which the callback should run,
394 * using the {@link android.os.SystemClock#uptimeMillis} time-base.
395 *
396 * @return Returns true if the Runnable was successfully placed in to the
397 * message queue. Returns false on failure, usually because the
398 * looper processing the message queue is exiting. Note that a
399 * result of true does not mean the Runnable will be processed -- if
400 * the looper is quit before the delivery time of the message
401 * occurs then the message will be dropped.
402 *
403 * @see android.os.SystemClock#uptimeMillis
404 */
405 public final boolean postAtTime(Runnable r, Object token, long uptimeMillis)
406 {
407 return sendMessageAtTime(getPostMessage(r, token), uptimeMillis);
408 }
409
410 /**
411 * Causes the Runnable r to be added to the message queue, to be run
412 * after the specified amount of time elapses.
413 * The runnable will be run on the thread to which this handler
414 * is attached.
David Christiea8cf4f22013-12-19 18:30:06 -0800415 * <b>The time-base is {@link android.os.SystemClock#uptimeMillis}.</b>
416 * Time spent in deep sleep will add an additional delay to execution.
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800417 *
418 * @param r The Runnable that will be executed.
419 * @param delayMillis The delay (in milliseconds) until the Runnable
420 * will be executed.
421 *
422 * @return Returns true if the Runnable was successfully placed in to the
423 * message queue. Returns false on failure, usually because the
424 * looper processing the message queue is exiting. Note that a
425 * result of true does not mean the Runnable will be processed --
426 * if the looper is quit before the delivery time of the message
427 * occurs then the message will be dropped.
428 */
429 public final boolean postDelayed(Runnable r, long delayMillis)
430 {
431 return sendMessageDelayed(getPostMessage(r), delayMillis);
432 }
433
434 /**
Jake Wharton820e3dd2018-01-02 22:18:24 -0500435 * Causes the Runnable r to be added to the message queue, to be run
436 * after the specified amount of time elapses.
437 * The runnable will be run on the thread to which this handler
438 * is attached.
439 * <b>The time-base is {@link android.os.SystemClock#uptimeMillis}.</b>
440 * Time spent in deep sleep will add an additional delay to execution.
441 *
442 * @param r The Runnable that will be executed.
443 * @param token An instance which can be used to cancel {@code r} via
444 * {@link #removeCallbacksAndMessages}.
445 * @param delayMillis The delay (in milliseconds) until the Runnable
446 * will be executed.
447 *
448 * @return Returns true if the Runnable was successfully placed in to the
449 * message queue. Returns false on failure, usually because the
450 * looper processing the message queue is exiting. Note that a
451 * result of true does not mean the Runnable will be processed --
452 * if the looper is quit before the delivery time of the message
453 * occurs then the message will be dropped.
454 */
455 public final boolean postDelayed(Runnable r, Object token, long delayMillis)
456 {
457 return sendMessageDelayed(getPostMessage(r, token), delayMillis);
458 }
459
460 /**
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800461 * Posts a message to an object that implements Runnable.
462 * Causes the Runnable r to executed on the next iteration through the
463 * message queue. The runnable will be run on the thread to which this
464 * handler is attached.
465 * <b>This method is only for use in very special circumstances -- it
466 * can easily starve the message queue, cause ordering problems, or have
467 * other unexpected side-effects.</b>
468 *
469 * @param r The Runnable that will be executed.
470 *
471 * @return Returns true if the message was successfully placed in to the
472 * message queue. Returns false on failure, usually because the
473 * looper processing the message queue is exiting.
474 */
475 public final boolean postAtFrontOfQueue(Runnable r)
476 {
477 return sendMessageAtFrontOfQueue(getPostMessage(r));
478 }
479
480 /**
Jeff Brownc53abc42012-08-29 04:43:25 -0700481 * Runs the specified task synchronously.
Jeff Brown8b60e452013-04-18 15:17:48 -0700482 * <p>
Jeff Brownc53abc42012-08-29 04:43:25 -0700483 * If the current thread is the same as the handler thread, then the runnable
484 * runs immediately without being enqueued. Otherwise, posts the runnable
485 * to the handler and waits for it to complete before returning.
Jeff Brown8b60e452013-04-18 15:17:48 -0700486 * </p><p>
Jeff Brownc53abc42012-08-29 04:43:25 -0700487 * This method is dangerous! Improper use can result in deadlocks.
488 * Never call this method while any locks are held or use it in a
489 * possibly re-entrant manner.
Jeff Brown8b60e452013-04-18 15:17:48 -0700490 * </p><p>
Jeff Brownc53abc42012-08-29 04:43:25 -0700491 * This method is occasionally useful in situations where a background thread
492 * must synchronously await completion of a task that must run on the
493 * handler's thread. However, this problem is often a symptom of bad design.
494 * Consider improving the design (if possible) before resorting to this method.
Jeff Brown8b60e452013-04-18 15:17:48 -0700495 * </p><p>
Jeff Brownc53abc42012-08-29 04:43:25 -0700496 * One example of where you might want to use this method is when you just
497 * set up a Handler thread and need to perform some initialization steps on
498 * it before continuing execution.
Jeff Brown8b60e452013-04-18 15:17:48 -0700499 * </p><p>
Jeff Brown4ed8fe72012-08-30 18:18:29 -0700500 * If timeout occurs then this method returns <code>false</code> but the runnable
501 * will remain posted on the handler and may already be in progress or
502 * complete at a later time.
Jeff Brown8b60e452013-04-18 15:17:48 -0700503 * </p><p>
504 * When using this method, be sure to use {@link Looper#quitSafely} when
505 * quitting the looper. Otherwise {@link #runWithScissors} may hang indefinitely.
506 * (TODO: We should fix this by making MessageQueue aware of blocking runnables.)
507 * </p>
Jeff Brown4ed8fe72012-08-30 18:18:29 -0700508 *
Jeff Brownc53abc42012-08-29 04:43:25 -0700509 * @param r The Runnable that will be executed synchronously.
Jeff Brown4ed8fe72012-08-30 18:18:29 -0700510 * @param timeout The timeout in milliseconds, or 0 to wait indefinitely.
Jeff Brownc53abc42012-08-29 04:43:25 -0700511 *
512 * @return Returns true if the Runnable was successfully executed.
513 * Returns false on failure, usually because the
514 * looper processing the message queue is exiting.
515 *
516 * @hide This method is prone to abuse and should probably not be in the API.
517 * If we ever do make it part of the API, we might want to rename it to something
518 * less funny like runUnsafe().
519 */
Jeff Brown4ed8fe72012-08-30 18:18:29 -0700520 public final boolean runWithScissors(final Runnable r, long timeout) {
Jeff Brownc53abc42012-08-29 04:43:25 -0700521 if (r == null) {
522 throw new IllegalArgumentException("runnable must not be null");
523 }
Jeff Brown4ed8fe72012-08-30 18:18:29 -0700524 if (timeout < 0) {
525 throw new IllegalArgumentException("timeout must be non-negative");
526 }
Jeff Brownc53abc42012-08-29 04:43:25 -0700527
528 if (Looper.myLooper() == mLooper) {
529 r.run();
530 return true;
531 }
532
533 BlockingRunnable br = new BlockingRunnable(r);
Jeff Brown4ed8fe72012-08-30 18:18:29 -0700534 return br.postAndWait(this, timeout);
Jeff Brownc53abc42012-08-29 04:43:25 -0700535 }
536
537 /**
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800538 * Remove any pending posts of Runnable r that are in the message queue.
539 */
540 public final void removeCallbacks(Runnable r)
541 {
542 mQueue.removeMessages(this, r, null);
543 }
544
545 /**
546 * Remove any pending posts of Runnable <var>r</var> with Object
Dianne Hackborn466ed242011-07-21 18:16:31 -0700547 * <var>token</var> that are in the message queue. If <var>token</var> is null,
548 * all callbacks will be removed.
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800549 */
550 public final void removeCallbacks(Runnable r, Object token)
551 {
552 mQueue.removeMessages(this, r, token);
553 }
554
555 /**
556 * Pushes a message onto the end of the message queue after all pending messages
557 * before the current time. It will be received in {@link #handleMessage},
558 * in the thread attached to this handler.
559 *
560 * @return Returns true if the message was successfully placed in to the
561 * message queue. Returns false on failure, usually because the
562 * looper processing the message queue is exiting.
563 */
564 public final boolean sendMessage(Message msg)
565 {
566 return sendMessageDelayed(msg, 0);
567 }
568
569 /**
570 * Sends a Message containing only the what value.
571 *
572 * @return Returns true if the message was successfully placed in to the
573 * message queue. Returns false on failure, usually because the
574 * looper processing the message queue is exiting.
575 */
576 public final boolean sendEmptyMessage(int what)
577 {
578 return sendEmptyMessageDelayed(what, 0);
579 }
580
581 /**
582 * Sends a Message containing only the what value, to be delivered
583 * after the specified amount of time elapses.
584 * @see #sendMessageDelayed(android.os.Message, long)
585 *
586 * @return Returns true if the message was successfully placed in to the
587 * message queue. Returns false on failure, usually because the
588 * looper processing the message queue is exiting.
589 */
590 public final boolean sendEmptyMessageDelayed(int what, long delayMillis) {
591 Message msg = Message.obtain();
592 msg.what = what;
593 return sendMessageDelayed(msg, delayMillis);
594 }
595
596 /**
597 * Sends a Message containing only the what value, to be delivered
598 * at a specific time.
599 * @see #sendMessageAtTime(android.os.Message, long)
600 *
601 * @return Returns true if the message was successfully placed in to the
602 * message queue. Returns false on failure, usually because the
603 * looper processing the message queue is exiting.
604 */
605
606 public final boolean sendEmptyMessageAtTime(int what, long uptimeMillis) {
607 Message msg = Message.obtain();
608 msg.what = what;
609 return sendMessageAtTime(msg, uptimeMillis);
610 }
611
612 /**
613 * Enqueue a message into the message queue after all pending messages
614 * before (current time + delayMillis). You will receive it in
615 * {@link #handleMessage}, in the thread attached to this handler.
616 *
617 * @return Returns true if the message was successfully placed in to the
618 * message queue. Returns false on failure, usually because the
619 * looper processing the message queue is exiting. Note that a
620 * result of true does not mean the message will be processed -- if
621 * the looper is quit before the delivery time of the message
622 * occurs then the message will be dropped.
623 */
624 public final boolean sendMessageDelayed(Message msg, long delayMillis)
625 {
626 if (delayMillis < 0) {
627 delayMillis = 0;
628 }
629 return sendMessageAtTime(msg, SystemClock.uptimeMillis() + delayMillis);
630 }
631
632 /**
633 * Enqueue a message into the message queue after all pending messages
634 * before the absolute time (in milliseconds) <var>uptimeMillis</var>.
635 * <b>The time-base is {@link android.os.SystemClock#uptimeMillis}.</b>
David Christiea8cf4f22013-12-19 18:30:06 -0800636 * Time spent in deep sleep will add an additional delay to execution.
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800637 * You will receive it in {@link #handleMessage}, in the thread attached
638 * to this handler.
639 *
640 * @param uptimeMillis The absolute time at which the message should be
641 * delivered, using the
642 * {@link android.os.SystemClock#uptimeMillis} time-base.
643 *
644 * @return Returns true if the message was successfully placed in to the
645 * message queue. Returns false on failure, usually because the
646 * looper processing the message queue is exiting. Note that a
647 * result of true does not mean the message will be processed -- if
648 * the looper is quit before the delivery time of the message
649 * occurs then the message will be dropped.
650 */
Jeff Brown109025d2012-08-14 20:41:30 -0700651 public boolean sendMessageAtTime(Message msg, long uptimeMillis) {
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800652 MessageQueue queue = mQueue;
Jeff Brown109025d2012-08-14 20:41:30 -0700653 if (queue == null) {
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800654 RuntimeException e = new RuntimeException(
Jeff Brown109025d2012-08-14 20:41:30 -0700655 this + " sendMessageAtTime() called with no mQueue");
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800656 Log.w("Looper", e.getMessage(), e);
Jeff Brown109025d2012-08-14 20:41:30 -0700657 return false;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800658 }
Jeff Brown109025d2012-08-14 20:41:30 -0700659 return enqueueMessage(queue, msg, uptimeMillis);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800660 }
661
662 /**
663 * Enqueue a message at the front of the message queue, to be processed on
664 * the next iteration of the message loop. You will receive it in
665 * {@link #handleMessage}, in the thread attached to this handler.
666 * <b>This method is only for use in very special circumstances -- it
667 * can easily starve the message queue, cause ordering problems, or have
668 * other unexpected side-effects.</b>
669 *
670 * @return Returns true if the message was successfully placed in to the
671 * message queue. Returns false on failure, usually because the
672 * looper processing the message queue is exiting.
673 */
Jeff Brown109025d2012-08-14 20:41:30 -0700674 public final boolean sendMessageAtFrontOfQueue(Message msg) {
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800675 MessageQueue queue = mQueue;
Jeff Brown109025d2012-08-14 20:41:30 -0700676 if (queue == null) {
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800677 RuntimeException e = new RuntimeException(
678 this + " sendMessageAtTime() called with no mQueue");
679 Log.w("Looper", e.getMessage(), e);
Jeff Brown109025d2012-08-14 20:41:30 -0700680 return false;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800681 }
Jeff Brown109025d2012-08-14 20:41:30 -0700682 return enqueueMessage(queue, msg, 0);
683 }
684
685 private boolean enqueueMessage(MessageQueue queue, Message msg, long uptimeMillis) {
686 msg.target = this;
687 if (mAsynchronous) {
688 msg.setAsynchronous(true);
689 }
690 return queue.enqueueMessage(msg, uptimeMillis);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800691 }
692
693 /**
694 * Remove any pending posts of messages with code 'what' that are in the
695 * message queue.
696 */
697 public final void removeMessages(int what) {
Jeff Brown0f85ce32012-02-16 14:41:10 -0800698 mQueue.removeMessages(this, what, null);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800699 }
700
701 /**
702 * Remove any pending posts of messages with code 'what' and whose obj is
Jeff Brown32c81132012-04-30 16:28:32 -0700703 * 'object' that are in the message queue. If <var>object</var> is null,
Dianne Hackborn466ed242011-07-21 18:16:31 -0700704 * all messages will be removed.
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800705 */
706 public final void removeMessages(int what, Object object) {
Jeff Brown0f85ce32012-02-16 14:41:10 -0800707 mQueue.removeMessages(this, what, object);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800708 }
709
710 /**
711 * Remove any pending posts of callbacks and sent messages whose
Dianne Hackborn466ed242011-07-21 18:16:31 -0700712 * <var>obj</var> is <var>token</var>. If <var>token</var> is null,
713 * all callbacks and messages will be removed.
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800714 */
715 public final void removeCallbacksAndMessages(Object token) {
716 mQueue.removeCallbacksAndMessages(this, token);
717 }
718
719 /**
720 * Check if there are any pending posts of messages with code 'what' in
721 * the message queue.
722 */
723 public final boolean hasMessages(int what) {
Jeff Brown0f85ce32012-02-16 14:41:10 -0800724 return mQueue.hasMessages(this, what, null);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800725 }
726
727 /**
Dianne Hackborncb015632017-06-14 17:30:15 -0700728 * Return whether there are any messages or callbacks currently scheduled on this handler.
729 * @hide
730 */
731 public final boolean hasMessagesOrCallbacks() {
732 return mQueue.hasMessages(this);
733 }
734
735 /**
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800736 * Check if there are any pending posts of messages with code 'what' and
737 * whose obj is 'object' in the message queue.
738 */
739 public final boolean hasMessages(int what, Object object) {
Jeff Brown0f85ce32012-02-16 14:41:10 -0800740 return mQueue.hasMessages(this, what, object);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800741 }
742
Romain Guyba6be8a2012-04-23 18:22:09 -0700743 /**
744 * Check if there are any pending posts of messages with callback r in
745 * the message queue.
746 *
747 * @hide
748 */
749 public final boolean hasCallbacks(Runnable r) {
750 return mQueue.hasMessages(this, r, null);
751 }
752
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800753 // if we can get rid of this method, the handler need not remember its loop
754 // we could instead export a getMessageQueue() method...
755 public final Looper getLooper() {
756 return mLooper;
757 }
758
759 public final void dump(Printer pw, String prefix) {
760 pw.println(prefix + this + " @ " + SystemClock.uptimeMillis());
761 if (mLooper == null) {
762 pw.println(prefix + "looper uninitialized");
763 } else {
764 mLooper.dump(pw, prefix + " ");
765 }
766 }
767
Dianne Hackborncb015632017-06-14 17:30:15 -0700768 /**
769 * @hide
770 */
771 public final void dumpMine(Printer pw, String prefix) {
772 pw.println(prefix + this + " @ " + SystemClock.uptimeMillis());
773 if (mLooper == null) {
774 pw.println(prefix + "looper uninitialized");
775 } else {
776 mLooper.dump(pw, prefix + " ", this);
777 }
778 }
779
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800780 @Override
781 public String toString() {
Kristian Monsen588d8562011-08-04 12:55:33 +0100782 return "Handler (" + getClass().getName() + ") {"
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800783 + Integer.toHexString(System.identityHashCode(this))
784 + "}";
785 }
786
787 final IMessenger getIMessenger() {
788 synchronized (mQueue) {
789 if (mMessenger != null) {
790 return mMessenger;
791 }
792 mMessenger = new MessengerImpl();
793 return mMessenger;
794 }
795 }
Brad Fitzpatrick333b8cb2010-08-26 12:04:57 -0700796
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800797 private final class MessengerImpl extends IMessenger.Stub {
798 public void send(Message msg) {
Dianne Hackborncb3ed1d2014-06-27 18:37:06 -0700799 msg.sendingUid = Binder.getCallingUid();
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800800 Handler.this.sendMessage(msg);
801 }
802 }
Brad Fitzpatrick333b8cb2010-08-26 12:04:57 -0700803
Romain Guyba6be8a2012-04-23 18:22:09 -0700804 private static Message getPostMessage(Runnable r) {
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800805 Message m = Message.obtain();
806 m.callback = r;
807 return m;
808 }
809
Romain Guyba6be8a2012-04-23 18:22:09 -0700810 private static Message getPostMessage(Runnable r, Object token) {
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800811 Message m = Message.obtain();
812 m.obj = token;
813 m.callback = r;
814 return m;
815 }
816
Romain Guyba6be8a2012-04-23 18:22:09 -0700817 private static void handleCallback(Message message) {
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800818 message.callback.run();
819 }
820
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800821 final Looper mLooper;
Jeff Sharkey74cd3de2016-04-06 17:40:54 -0600822 final MessageQueue mQueue;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800823 final Callback mCallback;
Jeff Brown109025d2012-08-14 20:41:30 -0700824 final boolean mAsynchronous;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800825 IMessenger mMessenger;
Jeff Brownc53abc42012-08-29 04:43:25 -0700826
827 private static final class BlockingRunnable implements Runnable {
828 private final Runnable mTask;
829 private boolean mDone;
830
831 public BlockingRunnable(Runnable task) {
832 mTask = task;
833 }
834
835 @Override
836 public void run() {
837 try {
838 mTask.run();
839 } finally {
840 synchronized (this) {
841 mDone = true;
842 notifyAll();
843 }
844 }
845 }
846
Jeff Brown4ed8fe72012-08-30 18:18:29 -0700847 public boolean postAndWait(Handler handler, long timeout) {
Jeff Brownc53abc42012-08-29 04:43:25 -0700848 if (!handler.post(this)) {
849 return false;
850 }
851
852 synchronized (this) {
Jeff Brown4ed8fe72012-08-30 18:18:29 -0700853 if (timeout > 0) {
854 final long expirationTime = SystemClock.uptimeMillis() + timeout;
855 while (!mDone) {
856 long delay = expirationTime - SystemClock.uptimeMillis();
857 if (delay <= 0) {
858 return false; // timeout
859 }
860 try {
861 wait(delay);
862 } catch (InterruptedException ex) {
863 }
864 }
865 } else {
866 while (!mDone) {
867 try {
868 wait();
869 } catch (InterruptedException ex) {
870 }
Jeff Brownc53abc42012-08-29 04:43:25 -0700871 }
872 }
873 }
874 return true;
875 }
876 }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800877}