diff options
| author | 2023-03-08 09:58:30 +0000 | |
|---|---|---|
| committer | 2023-03-08 09:58:30 +0000 | |
| commit | 2ea28e4c97e91d2f0b07a9f607f2893f4ce4dc79 (patch) | |
| tree | 77214710e3e6eb66dae2a2acb6176b5c6de1c054 | |
| parent | d746b23e6466e1d08761897bfa42cacd6fa217af (diff) | |
| parent | dbfdb3f58981c68d503c3d59d1381b13881acbb8 (diff) | |
Merge "Stop blocking broadcast receiver thread" into udc-dev
| -rw-r--r-- | services/core/java/com/android/server/timedetector/NetworkTimeUpdateService.java | 36 |
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)); |