OSDN Git Service

Fix last bit of WidgetTray jank issue
authorHyunyoung Song <hyunyoungs@google.com>
Tue, 16 Jun 2015 17:45:24 +0000 (10:45 -0700)
committerHyunyoung Song <hyunyoungs@google.com>
Tue, 16 Jun 2015 17:45:24 +0000 (10:45 -0700)
b/21133230

Change-Id: Ic198b8d21be1b0f3465cd4efc30a240e3ec4304a

src/com/android/launcher3/WidgetPreviewLoader.java

index 75952d1..46405ad 100644 (file)
@@ -55,6 +55,8 @@ public class WidgetPreviewLoader {
     /**
      * Weak reference objects, do not prevent their referents from being made finalizable,
      * finalized, and then reclaimed.
+     * Note: synchronized block used for this variable is expensive and the block should always
+     * be posted to a background thread.
      */
     @Thunk Set<Bitmap> mUnusedBitmaps =
             Collections.newSetFromMap(new WeakHashMap<Bitmap, Boolean>());
@@ -554,10 +556,15 @@ public class WidgetPreviewLoader {
             // in the tasks's onCancelled() call, and if cancelled while the task is writing to
             // disk, it will be cancelled in the task's onPostExecute() call.
             if (mTask.mBitmapToRecycle != null) {
-                synchronized (mUnusedBitmaps) {
-                    mUnusedBitmaps.add(mTask.mBitmapToRecycle);
-                }
-                mTask.mBitmapToRecycle = null;
+                mWorkerHandler.post(new Runnable() {
+                    @Override
+                    public void run() {
+                        synchronized (mUnusedBitmaps) {
+                            mUnusedBitmaps.add(mTask.mBitmapToRecycle);
+                        }
+                        mTask.mBitmapToRecycle = null;
+                    }
+                });
             }
         }
     }
@@ -660,14 +667,19 @@ public class WidgetPreviewLoader {
         }
 
         @Override
-        protected void onCancelled(Bitmap preview) {
+        protected void onCancelled(final Bitmap preview) {
             // If we've cancelled while the task is running, then can return the bitmap to the
             // recycled set immediately. Otherwise, it will be recycled after the preview is written
             // to disk.
             if (preview != null) {
-                synchronized (mUnusedBitmaps) {
-                    mUnusedBitmaps.add(preview);
-                }
+                mWorkerHandler.post(new Runnable() {
+                    @Override
+                    public void run() {
+                        synchronized (mUnusedBitmaps) {
+                            mUnusedBitmaps.add(preview);
+                        }
+                    }
+                });
             }
         }
     }