summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorSunny Goyal <sunnygoyal@google.com>2018-05-11 09:18:50 -0700
committerSunny Goyal <sunnygoyal@google.com>2018-05-11 09:24:44 -0700
commit8201d97225cf3fdb8461a3a04815715c4349a709 (patch)
tree16528892f5d3a057370849ce48b15a4a0ec310cb /src
parent08cf36ea546a65c15ca7651042f3dc48805fdab0 (diff)
downloadandroid_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.java49
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();
+ }
}
}