diff options
author | Sunny Goyal <sunnygoyal@google.com> | 2018-05-11 09:18:50 -0700 |
---|---|---|
committer | Sunny Goyal <sunnygoyal@google.com> | 2018-05-11 09:24:44 -0700 |
commit | 8201d97225cf3fdb8461a3a04815715c4349a709 (patch) | |
tree | 16528892f5d3a057370849ce48b15a4a0ec310cb /src | |
parent | 08cf36ea546a65c15ca7651042f3dc48805fdab0 (diff) | |
download | android_packages_apps_Trebuchet-8201d97225cf3fdb8461a3a04815715c4349a709.tar.gz android_packages_apps_Trebuchet-8201d97225cf3fdb8461a3a04815715c4349a709.tar.bz2 android_packages_apps_Trebuchet-8201d97225cf3fdb8461a3a04815715c4349a709.zip |
Increasing thread priority while loading high res icons
> On local testing, average load time decreased to ~50%
Bug: 79227823
Bug: 78583301
Change-Id: Ib948a697ebad5c91322c74f4ab36b603f3525c61
Diffstat (limited to 'src')
-rw-r--r-- | src/com/android/launcher3/IconCache.java | 49 |
1 files changed, 35 insertions, 14 deletions
diff --git a/src/com/android/launcher3/IconCache.java b/src/com/android/launcher3/IconCache.java index 168bd0839..8d79737c5 100644 --- a/src/com/android/launcher3/IconCache.java +++ b/src/com/android/launcher3/IconCache.java @@ -107,6 +107,8 @@ public class IconCache { private final BitmapFactory.Options mLowResOptions; private final BitmapFactory.Options mHighResOptions; + private int mPendingIconRequestCount = 0; + public IconCache(Context context, InvariantDeviceProfile inv) { mContext = context; mPackageManager = context.getPackageManager(); @@ -411,8 +413,13 @@ public class IconCache { */ public IconLoadRequest updateIconInBackground(final ItemInfoUpdateReceiver caller, final ItemInfoWithIcon info) { - Runnable request = new Runnable() { + Preconditions.assertUIThread(); + if (mPendingIconRequestCount <= 0) { + LauncherModel.setWorkerPriority(Process.THREAD_PRIORITY_FOREGROUND); + } + mPendingIconRequestCount ++; + IconLoadRequest request = new IconLoadRequest(mWorkerHandler, this::onIconRequestEnd) { @Override public void run() { if (info instanceof AppInfo || info instanceof ShortcutInfo) { @@ -420,17 +427,21 @@ public class IconCache { } else if (info instanceof PackageItemInfo) { getTitleAndIconForApp((PackageItemInfo) info, false); } - mMainThreadExecutor.execute(new Runnable() { - - @Override - public void run() { - caller.reapplyItemInfo(info); - } + mMainThreadExecutor.execute(() -> { + caller.reapplyItemInfo(info); + onEnd(); }); } }; - mWorkerHandler.post(request); - return new IconLoadRequest(request, mWorkerHandler); + Utilities.postAsyncCallback(mWorkerHandler, request); + return request; + } + + private void onIconRequestEnd() { + mPendingIconRequestCount --; + if (mPendingIconRequestCount <= 0) { + LauncherModel.setWorkerPriority(Process.THREAD_PRIORITY_BACKGROUND); + } } /** @@ -707,17 +718,27 @@ public class IconCache { return false; } - public static class IconLoadRequest { - private final Runnable mRunnable; + public static abstract class IconLoadRequest implements Runnable { private final Handler mHandler; + private final Runnable mEndRunnable; + + private boolean mEnded = false; - IconLoadRequest(Runnable runnable, Handler handler) { - mRunnable = runnable; + IconLoadRequest(Handler handler, Runnable endRunnable) { mHandler = handler; + mEndRunnable = endRunnable; } public void cancel() { - mHandler.removeCallbacks(mRunnable); + mHandler.removeCallbacks(this); + onEnd(); + } + + public void onEnd() { + if (!mEnded) { + mEnded = true; + mEndRunnable.run(); + } } } |