Skip to content

Commit f8d9e2f

Browse files
Jeff BrownAndroid (Google) Code Review
authored andcommitted
Merge "Make all messages in KeyguardViewMediator asynchronous." into jb-mr1-dev
2 parents 595b656 + 109025d commit f8d9e2f

File tree

2 files changed

+48
-20
lines changed

2 files changed

+48
-20
lines changed

core/java/android/os/Handler.java

Lines changed: 46 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,7 @@ public Handler() {
123123
}
124124
mQueue = mLooper.mQueue;
125125
mCallback = null;
126+
mAsynchronous = false;
126127
}
127128

128129
/**
@@ -147,6 +148,7 @@ public Handler(Callback callback) {
147148
}
148149
mQueue = mLooper.mQueue;
149150
mCallback = callback;
151+
mAsynchronous = false;
150152
}
151153

152154
/**
@@ -156,6 +158,7 @@ public Handler(Looper looper) {
156158
mLooper = looper;
157159
mQueue = looper.mQueue;
158160
mCallback = null;
161+
mAsynchronous = false;
159162
}
160163

161164
/**
@@ -166,6 +169,31 @@ public Handler(Looper looper, Callback callback) {
166169
mLooper = looper;
167170
mQueue = looper.mQueue;
168171
mCallback = callback;
172+
mAsynchronous = false;
173+
}
174+
175+
/**
176+
* Use the provided queue instead of the default one and take a callback
177+
* interface in which to handle messages. Also set whether the handler
178+
* should be asynchronous.
179+
*
180+
* Handlers are synchronous by default unless this constructor is used to make
181+
* one that is strictly asynchronous.
182+
*
183+
* Asynchronous messages represent interrupts or events that do not require global ordering
184+
* with represent to synchronous messages. Asynchronous messages are not subject to
185+
* the synchronization barriers introduced by {@link MessageQueue#enqueueSyncBarrier(long)}.
186+
*
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(Looper looper, Callback callback, boolean async) {
193+
mLooper = looper;
194+
mQueue = looper.mQueue;
195+
mCallback = callback;
196+
mAsynchronous = async;
169197
}
170198

171199
/**
@@ -464,20 +492,15 @@ public final boolean sendMessageDelayed(Message msg, long delayMillis)
464492
* the looper is quit before the delivery time of the message
465493
* occurs then the message will be dropped.
466494
*/
467-
public boolean sendMessageAtTime(Message msg, long uptimeMillis)
468-
{
469-
boolean sent = false;
495+
public boolean sendMessageAtTime(Message msg, long uptimeMillis) {
470496
MessageQueue queue = mQueue;
471-
if (queue != null) {
472-
msg.target = this;
473-
sent = queue.enqueueMessage(msg, uptimeMillis);
474-
}
475-
else {
497+
if (queue == null) {
476498
RuntimeException e = new RuntimeException(
477-
this + " sendMessageAtTime() called with no mQueue");
499+
this + " sendMessageAtTime() called with no mQueue");
478500
Log.w("Looper", e.getMessage(), e);
501+
return false;
479502
}
480-
return sent;
503+
return enqueueMessage(queue, msg, uptimeMillis);
481504
}
482505

483506
/**
@@ -492,20 +515,23 @@ public boolean sendMessageAtTime(Message msg, long uptimeMillis)
492515
* message queue. Returns false on failure, usually because the
493516
* looper processing the message queue is exiting.
494517
*/
495-
public final boolean sendMessageAtFrontOfQueue(Message msg)
496-
{
497-
boolean sent = false;
518+
public final boolean sendMessageAtFrontOfQueue(Message msg) {
498519
MessageQueue queue = mQueue;
499-
if (queue != null) {
500-
msg.target = this;
501-
sent = queue.enqueueMessage(msg, 0);
502-
}
503-
else {
520+
if (queue == null) {
504521
RuntimeException e = new RuntimeException(
505522
this + " sendMessageAtTime() called with no mQueue");
506523
Log.w("Looper", e.getMessage(), e);
524+
return false;
525+
}
526+
return enqueueMessage(queue, msg, 0);
527+
}
528+
529+
private boolean enqueueMessage(MessageQueue queue, Message msg, long uptimeMillis) {
530+
msg.target = this;
531+
if (mAsynchronous) {
532+
msg.setAsynchronous(true);
507533
}
508-
return sent;
534+
return queue.enqueueMessage(msg, uptimeMillis);
509535
}
510536

511537
/**
@@ -618,5 +644,6 @@ private static void handleCallback(Message message) {
618644
final MessageQueue mQueue;
619645
final Looper mLooper;
620646
final Callback mCallback;
647+
final boolean mAsynchronous;
621648
IMessenger mMessenger;
622649
}

policy/src/com/android/internal/policy/impl/KeyguardViewMediator.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
import android.media.SoundPool;
3535
import android.os.Handler;
3636
import android.os.LocalPowerManager;
37+
import android.os.Looper;
3738
import android.os.Message;
3839
import android.os.PowerManager;
3940
import android.os.RemoteException;
@@ -976,7 +977,7 @@ public void keyguardDoneDrawing() {
976977
* interacts with the keyguard ui should be posted to this handler, rather
977978
* than called directly.
978979
*/
979-
private Handler mHandler = new Handler() {
980+
private Handler mHandler = new Handler(Looper.myLooper(), null, true /*async*/) {
980981
@Override
981982
public void handleMessage(Message msg) {
982983
switch (msg.what) {

0 commit comments

Comments
 (0)