summaryrefslogtreecommitdiffstats
path: root/core/java/com
diff options
context:
space:
mode:
authorDianne Hackborn <hackbod@google.com>2012-04-20 13:44:43 -0700
committerAndroid (Google) Code Review <android-gerrit@google.com>2012-04-20 13:44:43 -0700
commite1a996e99dc68b48efad989876c01ce05a7a58ac (patch)
tree59b3362ca86cc68c19b6060feecda2cc7d44b1cc /core/java/com
parentebd477518f10d61b1164c0df6c14cb2d0e59ecf0 (diff)
parentd0d7503fd3e941113094532f28986f49b11b5fdb (diff)
downloadframeworks_base-e1a996e99dc68b48efad989876c01ce05a7a58ac.zip
frameworks_base-e1a996e99dc68b48efad989876c01ce05a7a58ac.tar.gz
frameworks_base-e1a996e99dc68b48efad989876c01ce05a7a58ac.tar.bz2
Merge "Move handling of package changes to a background thread."
Diffstat (limited to 'core/java/com')
-rw-r--r--core/java/com/android/internal/app/ResolverActivity.java4
-rw-r--r--core/java/com/android/internal/content/PackageMonitor.java37
2 files changed, 33 insertions, 8 deletions
diff --git a/core/java/com/android/internal/app/ResolverActivity.java b/core/java/com/android/internal/app/ResolverActivity.java
index af722a8..5862d3e 100644
--- a/core/java/com/android/internal/app/ResolverActivity.java
+++ b/core/java/com/android/internal/app/ResolverActivity.java
@@ -99,7 +99,7 @@ public class ResolverActivity extends AlertActivity implements
ap.mTitle = title;
ap.mOnClickListener = this;
- mPackageMonitor.register(this, false);
+ mPackageMonitor.register(this, getMainLooper(), false);
if (alwaysUseOption) {
LayoutInflater inflater = (LayoutInflater) getSystemService(
@@ -135,7 +135,7 @@ public class ResolverActivity extends AlertActivity implements
@Override
protected void onRestart() {
super.onRestart();
- mPackageMonitor.register(this, false);
+ mPackageMonitor.register(this, getMainLooper(), false);
mAdapter.handlePackagesChanged();
}
diff --git a/core/java/com/android/internal/content/PackageMonitor.java b/core/java/com/android/internal/content/PackageMonitor.java
index 32d8641..f41fcc6 100644
--- a/core/java/com/android/internal/content/PackageMonitor.java
+++ b/core/java/com/android/internal/content/PackageMonitor.java
@@ -21,6 +21,9 @@ import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.net.Uri;
+import android.os.Handler;
+import android.os.HandlerThread;
+import android.os.Looper;
import java.util.HashSet;
@@ -32,7 +35,11 @@ public abstract class PackageMonitor extends android.content.BroadcastReceiver {
static final IntentFilter sPackageFilt = new IntentFilter();
static final IntentFilter sNonDataFilt = new IntentFilter();
static final IntentFilter sExternalFilt = new IntentFilter();
-
+
+ static final Object sLock = new Object();
+ static HandlerThread sBackgroundThread;
+ static Handler sBackgroundHandler;
+
static {
sPackageFilt.addAction(Intent.ACTION_PACKAGE_ADDED);
sPackageFilt.addAction(Intent.ACTION_PACKAGE_REMOVED);
@@ -49,6 +56,7 @@ public abstract class PackageMonitor extends android.content.BroadcastReceiver {
final HashSet<String> mUpdatingPackages = new HashSet<String>();
Context mRegisteredContext;
+ Handler mRegisteredHandler;
String[] mDisappearingPackages;
String[] mAppearingPackages;
String[] mModifiedPackages;
@@ -57,18 +65,35 @@ public abstract class PackageMonitor extends android.content.BroadcastReceiver {
String[] mTempArray = new String[1];
- public void register(Context context, boolean externalStorage) {
+ public void register(Context context, Looper thread, boolean externalStorage) {
if (mRegisteredContext != null) {
throw new IllegalStateException("Already registered");
}
mRegisteredContext = context;
- context.registerReceiver(this, sPackageFilt);
- context.registerReceiver(this, sNonDataFilt);
+ if (thread == null) {
+ synchronized (sLock) {
+ if (sBackgroundThread == null) {
+ sBackgroundThread = new HandlerThread("PackageMonitor",
+ android.os.Process.THREAD_PRIORITY_BACKGROUND);
+ sBackgroundThread.start();
+ sBackgroundHandler = new Handler(sBackgroundThread.getLooper());
+ }
+ mRegisteredHandler = sBackgroundHandler;
+ }
+ } else {
+ mRegisteredHandler = new Handler(thread);
+ }
+ context.registerReceiver(this, sPackageFilt, null, mRegisteredHandler);
+ context.registerReceiver(this, sNonDataFilt, null, mRegisteredHandler);
if (externalStorage) {
- context.registerReceiver(this, sExternalFilt);
+ context.registerReceiver(this, sExternalFilt, null, mRegisteredHandler);
}
}
-
+
+ public Handler getRegisteredHandler() {
+ return mRegisteredHandler;
+ }
+
public void unregister() {
if (mRegisteredContext == null) {
throw new IllegalStateException("Not registered");