summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Neil Fuller <nfuller@google.com> 2023-03-08 09:58:30 +0000
committer Android (Google) Code Review <android-gerrit@google.com> 2023-03-08 09:58:30 +0000
commit2ea28e4c97e91d2f0b07a9f607f2893f4ce4dc79 (patch)
tree77214710e3e6eb66dae2a2acb6176b5c6de1c054
parentd746b23e6466e1d08761897bfa42cacd6fa217af (diff)
parentdbfdb3f58981c68d503c3d59d1381b13881acbb8 (diff)
Merge "Stop blocking broadcast receiver thread" into udc-dev
-rw-r--r--services/core/java/com/android/server/timedetector/NetworkTimeUpdateService.java36
1 files changed, 22 insertions, 14 deletions
diff --git a/services/core/java/com/android/server/timedetector/NetworkTimeUpdateService.java b/services/core/java/com/android/server/timedetector/NetworkTimeUpdateService.java
index de631bb53377..e7c073c4846d 100644
--- a/services/core/java/com/android/server/timedetector/NetworkTimeUpdateService.java
+++ b/services/core/java/com/android/server/timedetector/NetworkTimeUpdateService.java
@@ -30,7 +30,6 @@ import android.content.Intent;
import android.content.IntentFilter;
import android.database.ContentObserver;
import android.net.ConnectivityManager;
-import android.net.ConnectivityManager.NetworkCallback;
import android.net.Network;
import android.os.Binder;
import android.os.Handler;
@@ -140,20 +139,12 @@ public class NetworkTimeUpdateService extends Binder {
/** Initialize the receivers and initiate the first NTP request */
public void systemRunning() {
// Listen for scheduled refreshes.
- mContext.registerReceiver(
- new BroadcastReceiver() {
- @Override
- public void onReceive(Context context, Intent intent) {
- onPollNetworkTime("scheduled refresh");
- }
- },
- new IntentFilter(ACTION_POLL),
- /*broadcastPermission=*/ null,
- mHandler);
+ ScheduledRefreshBroadcastReceiver receiver = new ScheduledRefreshBroadcastReceiver();
+ mContext.registerReceiver(receiver, new IntentFilter(ACTION_POLL));
// Listen for network connectivity changes.
- NetworkTimeUpdateCallback networkTimeUpdateCallback = new NetworkTimeUpdateCallback();
- mCM.registerDefaultNetworkCallback(networkTimeUpdateCallback, mHandler);
+ NetworkConnectivityCallback networkConnectivityCallback = new NetworkConnectivityCallback();
+ mCM.registerDefaultNetworkCallback(networkConnectivityCallback, mHandler);
// Listen for user settings changes.
ContentResolver resolver = mContext.getContentResolver();
@@ -223,8 +214,25 @@ public class NetworkTimeUpdateService extends Binder {
}
}
+ private class ScheduledRefreshBroadcastReceiver extends BroadcastReceiver implements Runnable {
+
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ // The BroadcastReceiver has to complete quickly or an ANR will be triggered by the
+ // platform regardless of the receiver thread used. Instead of blocking the receiver
+ // thread, the long-running / blocking work is posted to mHandler to allow onReceive()
+ // to return immediately.
+ mHandler.post(this);
+ }
+
+ @Override
+ public void run() {
+ onPollNetworkTime("scheduled refresh");
+ }
+ }
+
// All callbacks will be invoked using mHandler because of how the callback is registered.
- private class NetworkTimeUpdateCallback extends NetworkCallback {
+ private class NetworkConnectivityCallback extends ConnectivityManager.NetworkCallback {
@Override
public void onAvailable(@NonNull Network network) {
Log.d(TAG, String.format("New default network %s; checking time.", network));