diff options
author | 2016-06-07 15:09:51 -0700 | |
---|---|---|
committer | 2016-06-07 15:37:58 -0700 | |
commit | c292378d3b7a6ebb3ebd5caef631a76a386c2974 (patch) | |
tree | 8cb0a56c046e5b844c20b8e508f79c0e980f757c | |
parent | 446484ca7786bdaac99a7cb39412ffc0e9afe513 (diff) |
Recycle after return to avoid returning an invalid value.
Also add some main thread assertions.
Change-Id: Id6314d6e92d530ce57a01902b5570381fa20044d
-rw-r--r-- | src/com/android/documentsui/ThumbnailCache.java | 7 | ||||
-rw-r--r-- | src/com/android/documentsui/dirlist/IconHelper.java | 38 |
2 files changed, 28 insertions, 17 deletions
diff --git a/src/com/android/documentsui/ThumbnailCache.java b/src/com/android/documentsui/ThumbnailCache.java index 53f5092e9..ee2f168d5 100644 --- a/src/com/android/documentsui/ThumbnailCache.java +++ b/src/com/android/documentsui/ThumbnailCache.java @@ -22,6 +22,7 @@ import android.content.ComponentCallbacks2; import android.graphics.Bitmap; import android.graphics.Point; import android.net.Uri; +import android.os.Looper; import android.util.LruCache; import android.util.Pair; import android.util.Pools; @@ -195,6 +196,9 @@ public class ThumbnailCache { private static Result obtain(@Status int status, @Nullable Bitmap thumbnail, @Nullable Point size, long lastModified) { + // Make sure this method is only called from main thread. + assert(Looper.myLooper() == Looper.getMainLooper()); + Result instance = sPool.acquire(); instance = (instance != null ? instance : new Result()); @@ -209,6 +213,9 @@ public class ThumbnailCache { private Result() {} public void recycle() { + // Make sure this method is only called from main thread. + assert(Looper.myLooper() == Looper.getMainLooper()); + mStatus = -1; mThumbnail = null; mSize = null; diff --git a/src/com/android/documentsui/dirlist/IconHelper.java b/src/com/android/documentsui/dirlist/IconHelper.java index 78257bd12..0c7399273 100644 --- a/src/com/android/documentsui/dirlist/IconHelper.java +++ b/src/com/android/documentsui/dirlist/IconHelper.java @@ -258,25 +258,29 @@ public class IconHelper { ImageView iconThumb, ImageView iconMime) { final Result result = mThumbnailCache.getThumbnail(uri, mCurrentSize); - final Bitmap cachedThumbnail = result.getThumbnail(); - iconThumb.setImageBitmap(cachedThumbnail); - - boolean stale = (docLastModified > result.getLastModified()); - if (DEBUG) Log.d(TAG, String.format("Load thumbnail for %s, got result %d and stale %b.", - uri.toString(), result.getStatus(), stale)); - if (!result.isExactHit() || stale) { - final BiConsumer<View, View> animator = - (cachedThumbnail == null ? ANIM_FADE_IN : ANIM_NO_OP); - final LoaderTask task = new LoaderTask(uri, iconMime, iconThumb, mCurrentSize, - docLastModified, animator); - - iconThumb.setTag(task); + try { + final Bitmap cachedThumbnail = result.getThumbnail(); + iconThumb.setImageBitmap(cachedThumbnail); + + boolean stale = (docLastModified > result.getLastModified()); + if (DEBUG) Log.d(TAG, + String.format("Load thumbnail for %s, got result %d and stale %b.", + uri.toString(), result.getStatus(), stale)); + if (!result.isExactHit() || stale) { + final BiConsumer<View, View> animator = + (cachedThumbnail == null ? ANIM_FADE_IN : ANIM_NO_OP); + final LoaderTask task = new LoaderTask(uri, iconMime, iconThumb, mCurrentSize, + docLastModified, animator); + + iconThumb.setTag(task); + + ProviderExecutor.forAuthority(docAuthority).execute(task); + } - ProviderExecutor.forAuthority(docAuthority).execute(task); + return result.isHit(); + } finally { + result.recycle(); } - result.recycle(); - - return result.isHit(); } private void setMimeIcon(ImageView view, Drawable icon) { |