diff options
| author | Jeff Brown <jeffbrown@google.com> | 2012-08-14 20:41:30 -0700 |
|---|---|---|
| committer | Jeff Brown <jeffbrown@google.com> | 2012-08-14 20:44:44 -0700 |
| commit | 109025d778c12d78f8585920447320aaf0f1d2f8 (patch) | |
| tree | f49fe76563313e2e3929f2d9971269866d947dcd /core/java | |
| parent | 34743ac7d688a7ecf4daec84078fc7ec74a6dac9 (diff) | |
| download | frameworks_base-109025d778c12d78f8585920447320aaf0f1d2f8.zip frameworks_base-109025d778c12d78f8585920447320aaf0f1d2f8.tar.gz frameworks_base-109025d778c12d78f8585920447320aaf0f1d2f8.tar.bz2 | |
Make all messages in KeyguardViewMediator asynchronous.
We don't want these messages to get blocked by UI traversals.
Added a convenience for creating Handlers that always send
asynchronous messages.
Change-Id: Id568e87fcb8b169e8c52c5fe1dc76a4a5771570b
Diffstat (limited to 'core/java')
| -rw-r--r-- | core/java/android/os/Handler.java | 65 |
1 files changed, 46 insertions, 19 deletions
diff --git a/core/java/android/os/Handler.java b/core/java/android/os/Handler.java index b892c81..7785368 100644 --- a/core/java/android/os/Handler.java +++ b/core/java/android/os/Handler.java @@ -123,6 +123,7 @@ public class Handler { } mQueue = mLooper.mQueue; mCallback = null; + mAsynchronous = false; } /** @@ -147,6 +148,7 @@ public class Handler { } mQueue = mLooper.mQueue; mCallback = callback; + mAsynchronous = false; } /** @@ -156,6 +158,7 @@ public class Handler { mLooper = looper; mQueue = looper.mQueue; mCallback = null; + mAsynchronous = false; } /** @@ -166,6 +169,31 @@ public class Handler { mLooper = looper; mQueue = looper.mQueue; mCallback = callback; + mAsynchronous = false; + } + + /** + * Use the provided queue instead of the default one and take a callback + * interface in which to handle messages. Also set whether the handler + * should be asynchronous. + * + * Handlers are synchronous by default unless this constructor is used to make + * one that is strictly asynchronous. + * + * Asynchronous messages represent interrupts or events that do not require global ordering + * with represent to synchronous messages. Asynchronous messages are not subject to + * the synchronization barriers introduced by {@link MessageQueue#enqueueSyncBarrier(long)}. + * + * @param async If true, the handler calls {@link Message#setAsynchronous(boolean)} for + * each {@link Message} that is sent to it or {@link Runnable} that is posted to it. + * + * @hide + */ + public Handler(Looper looper, Callback callback, boolean async) { + mLooper = looper; + mQueue = looper.mQueue; + mCallback = callback; + mAsynchronous = async; } /** @@ -464,20 +492,15 @@ public class Handler { * the looper is quit before the delivery time of the message * occurs then the message will be dropped. */ - public boolean sendMessageAtTime(Message msg, long uptimeMillis) - { - boolean sent = false; + public boolean sendMessageAtTime(Message msg, long uptimeMillis) { MessageQueue queue = mQueue; - if (queue != null) { - msg.target = this; - sent = queue.enqueueMessage(msg, uptimeMillis); - } - else { + if (queue == null) { RuntimeException e = new RuntimeException( - this + " sendMessageAtTime() called with no mQueue"); + this + " sendMessageAtTime() called with no mQueue"); Log.w("Looper", e.getMessage(), e); + return false; } - return sent; + return enqueueMessage(queue, msg, uptimeMillis); } /** @@ -492,20 +515,23 @@ public class Handler { * message queue. Returns false on failure, usually because the * looper processing the message queue is exiting. */ - public final boolean sendMessageAtFrontOfQueue(Message msg) - { - boolean sent = false; + public final boolean sendMessageAtFrontOfQueue(Message msg) { MessageQueue queue = mQueue; - if (queue != null) { - msg.target = this; - sent = queue.enqueueMessage(msg, 0); - } - else { + if (queue == null) { RuntimeException e = new RuntimeException( this + " sendMessageAtTime() called with no mQueue"); Log.w("Looper", e.getMessage(), e); + return false; + } + return enqueueMessage(queue, msg, 0); + } + + private boolean enqueueMessage(MessageQueue queue, Message msg, long uptimeMillis) { + msg.target = this; + if (mAsynchronous) { + msg.setAsynchronous(true); } - return sent; + return queue.enqueueMessage(msg, uptimeMillis); } /** @@ -618,5 +644,6 @@ public class Handler { final MessageQueue mQueue; final Looper mLooper; final Callback mCallback; + final boolean mAsynchronous; IMessenger mMessenger; } |
