summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/java/android/os/Handler.java27
-rw-r--r--core/java/com/android/internal/os/BackgroundThread.java3
-rw-r--r--services/core/java/com/android/server/DisplayThread.java2
-rw-r--r--services/core/java/com/android/server/FgThread.java2
-rw-r--r--services/core/java/com/android/server/IoThread.java2
-rw-r--r--services/core/java/com/android/server/ServiceThread.java6
-rw-r--r--services/core/java/com/android/server/UiThread.java2
7 files changed, 35 insertions, 9 deletions
diff --git a/core/java/android/os/Handler.java b/core/java/android/os/Handler.java
index 834867cab3a8..ceaf337b2122 100644
--- a/core/java/android/os/Handler.java
+++ b/core/java/android/os/Handler.java
@@ -230,6 +230,7 @@ public class Handler {
mQueue = mLooper.mQueue;
mCallback = callback;
mAsynchronous = async;
+ mIsShared = false;
}
/**
@@ -253,10 +254,17 @@ public class Handler {
*/
@UnsupportedAppUsage
public Handler(@NonNull Looper looper, @Nullable Callback callback, boolean async) {
+ this(looper, callback, async, /* shared= */ false);
+ }
+
+ /** @hide */
+ public Handler(@NonNull Looper looper, @Nullable Callback callback, boolean async,
+ boolean shared) {
mLooper = looper;
mQueue = looper.mQueue;
mCallback = callback;
mAsynchronous = async;
+ mIsShared = shared;
}
/**
@@ -778,6 +786,14 @@ public class Handler {
return queue.enqueueMessage(msg, uptimeMillis);
}
+ private Object disallowNullArgumentIfShared(@Nullable Object arg) {
+ if (mIsShared && arg == null) {
+ throw new IllegalArgumentException("Null argument disallowed for shared handler."
+ + " Consider creating your own Handler instance.");
+ }
+ return arg;
+ }
+
/**
* Remove any pending posts of messages with code 'what' that are in the
* message queue.
@@ -792,7 +808,7 @@ public class Handler {
* all messages will be removed.
*/
public final void removeMessages(int what, @Nullable Object object) {
- mQueue.removeMessages(this, what, object);
+ mQueue.removeMessages(this, what, disallowNullArgumentIfShared(object));
}
/**
@@ -807,7 +823,7 @@ public class Handler {
*@hide
*/
public final void removeEqualMessages(int what, @Nullable Object object) {
- mQueue.removeEqualMessages(this, what, object);
+ mQueue.removeEqualMessages(this, what, disallowNullArgumentIfShared(object));
}
/**
@@ -816,7 +832,7 @@ public class Handler {
* all callbacks and messages will be removed.
*/
public final void removeCallbacksAndMessages(@Nullable Object token) {
- mQueue.removeCallbacksAndMessages(this, token);
+ mQueue.removeCallbacksAndMessages(this, disallowNullArgumentIfShared(token));
}
/**
@@ -827,7 +843,7 @@ public class Handler {
*@hide
*/
public final void removeCallbacksAndEqualMessages(@Nullable Object token) {
- mQueue.removeCallbacksAndEqualMessages(this, token);
+ mQueue.removeCallbacksAndEqualMessages(this, disallowNullArgumentIfShared(token));
}
/**
* Check if there are any pending posts of messages with code 'what' in
@@ -951,6 +967,9 @@ public class Handler {
@UnsupportedAppUsage
IMessenger mMessenger;
+ /** If it's a shared handler, we disallow certain dangeraous operations. */
+ private final boolean mIsShared;
+
private static final class BlockingRunnable implements Runnable {
private final Runnable mTask;
private boolean mDone;
diff --git a/core/java/com/android/internal/os/BackgroundThread.java b/core/java/com/android/internal/os/BackgroundThread.java
index 22c832e0689c..72da819bb736 100644
--- a/core/java/com/android/internal/os/BackgroundThread.java
+++ b/core/java/com/android/internal/os/BackgroundThread.java
@@ -46,7 +46,8 @@ public final class BackgroundThread extends HandlerThread {
looper.setTraceTag(Trace.TRACE_TAG_SYSTEM_SERVER);
looper.setSlowLogThresholdMs(
SLOW_DISPATCH_THRESHOLD_MS, SLOW_DELIVERY_THRESHOLD_MS);
- sHandler = new Handler(sInstance.getLooper());
+ sHandler = new Handler(sInstance.getLooper(), /*callback=*/ null, /* async=*/ false,
+ /* shared=*/ true);
sHandlerExecutor = new HandlerExecutor(sHandler);
}
}
diff --git a/services/core/java/com/android/server/DisplayThread.java b/services/core/java/com/android/server/DisplayThread.java
index a07ade050e92..13e9550a7bae 100644
--- a/services/core/java/com/android/server/DisplayThread.java
+++ b/services/core/java/com/android/server/DisplayThread.java
@@ -43,7 +43,7 @@ public final class DisplayThread extends ServiceThread {
sInstance = new DisplayThread();
sInstance.start();
sInstance.getLooper().setTraceTag(Trace.TRACE_TAG_SYSTEM_SERVER);
- sHandler = new Handler(sInstance.getLooper());
+ sHandler = makeSharedHandler(sInstance.getLooper());
}
}
diff --git a/services/core/java/com/android/server/FgThread.java b/services/core/java/com/android/server/FgThread.java
index 5d0e308f6649..b4b6e3f1c3c1 100644
--- a/services/core/java/com/android/server/FgThread.java
+++ b/services/core/java/com/android/server/FgThread.java
@@ -51,7 +51,7 @@ public final class FgThread extends ServiceThread {
looper.setTraceTag(Trace.TRACE_TAG_SYSTEM_SERVER);
looper.setSlowLogThresholdMs(
SLOW_DISPATCH_THRESHOLD_MS, SLOW_DELIVERY_THRESHOLD_MS);
- sHandler = new Handler(sInstance.getLooper());
+ sHandler = makeSharedHandler(sInstance.getLooper());
sHandlerExecutor = new HandlerExecutor(sHandler);
}
}
diff --git a/services/core/java/com/android/server/IoThread.java b/services/core/java/com/android/server/IoThread.java
index 21fd29c3bbef..10d5274187a5 100644
--- a/services/core/java/com/android/server/IoThread.java
+++ b/services/core/java/com/android/server/IoThread.java
@@ -41,7 +41,7 @@ public final class IoThread extends ServiceThread {
sInstance = new IoThread();
sInstance.start();
sInstance.getLooper().setTraceTag(Trace.TRACE_TAG_SYSTEM_SERVER);
- sHandler = new Handler(sInstance.getLooper());
+ sHandler = makeSharedHandler(sInstance.getLooper());
sHandlerExecutor = new HandlerExecutor(sHandler);
}
}
diff --git a/services/core/java/com/android/server/ServiceThread.java b/services/core/java/com/android/server/ServiceThread.java
index 26703c514a96..6d8e49c7c869 100644
--- a/services/core/java/com/android/server/ServiceThread.java
+++ b/services/core/java/com/android/server/ServiceThread.java
@@ -16,7 +16,9 @@
package com.android.server;
+import android.os.Handler;
import android.os.HandlerThread;
+import android.os.Looper;
import android.os.Process;
import android.os.StrictMode;
@@ -43,4 +45,8 @@ public class ServiceThread extends HandlerThread {
super.run();
}
+
+ protected static Handler makeSharedHandler(Looper looper) {
+ return new Handler(looper, /*callback=*/ null, /* async=*/ false, /* shared=*/ true);
+ }
}
diff --git a/services/core/java/com/android/server/UiThread.java b/services/core/java/com/android/server/UiThread.java
index 34fc9abec51e..88004bd5f619 100644
--- a/services/core/java/com/android/server/UiThread.java
+++ b/services/core/java/com/android/server/UiThread.java
@@ -53,7 +53,7 @@ public final class UiThread extends ServiceThread {
looper.setTraceTag(Trace.TRACE_TAG_SYSTEM_SERVER);
looper.setSlowLogThresholdMs(
SLOW_DISPATCH_THRESHOLD_MS, SLOW_DELIVERY_THRESHOLD_MS);
- sHandler = new Handler(sInstance.getLooper());
+ sHandler = makeSharedHandler(sInstance.getLooper());
}
}