summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Neil Fuller <nfuller@google.com> 2023-03-07 14:06:39 +0000
committer Neil Fuller <nfuller@google.com> 2023-03-07 14:20:29 +0000
commitdbfdb3f58981c68d503c3d59d1381b13881acbb8 (patch)
treebab360aa043afcd1b028e36d89d3416f65ba4b0e
parentc752ab59a2ca2e097b65c221f15ebf27d4ce429a (diff)
Stop blocking broadcast receiver thread
Stop blocking broadcast receiver thread during network operations. This reverts part of a behavior change from commit 6bb629bb088. That commit switched a BroadcastReceiver over to using a specific handler (X) for some long-running work. That isn't the same behavior as posting the work to handler X and returning immediately, and it can cause an ANR if the work takes too long. The behavior has been changed back to explicitly post work to the handler and return. Bug: 271951363 Test: build / boot / treehugger Change-Id: I9aeaf200d19de97b5be909678aab8d5421cd11a4
-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 399e9413bded..61386cbbc378 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();
@@ -241,8 +232,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));