diff options
author | Dianne Hackborn <hackbod@google.com> | 2012-04-20 13:44:43 -0700 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2012-04-20 13:44:43 -0700 |
commit | e1a996e99dc68b48efad989876c01ce05a7a58ac (patch) | |
tree | 59b3362ca86cc68c19b6060feecda2cc7d44b1cc /core/java/com | |
parent | ebd477518f10d61b1164c0df6c14cb2d0e59ecf0 (diff) | |
parent | d0d7503fd3e941113094532f28986f49b11b5fdb (diff) | |
download | frameworks_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.java | 4 | ||||
-rw-r--r-- | core/java/com/android/internal/content/PackageMonitor.java | 37 |
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"); |