summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Garfield, Tan <xutan@google.com> 2016-06-07 15:09:51 -0700
committer Garfield, Tan <xutan@google.com> 2016-06-07 15:37:58 -0700
commitc292378d3b7a6ebb3ebd5caef631a76a386c2974 (patch)
tree8cb0a56c046e5b844c20b8e508f79c0e980f757c
parent446484ca7786bdaac99a7cb39412ffc0e9afe513 (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.java7
-rw-r--r--src/com/android/documentsui/dirlist/IconHelper.java38
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) {