Android Open Source - Android-Fast-ImageLoader Recycling Bitmap Drawable






From Project

Back to project page Android-Fast-ImageLoader.

License

The source code is released under:

Apache License

If you think the Android project Android-Fast-ImageLoader listed in this page is inappropriate, such as containing malicious code/tools or violating the copyright, please email info at java2s dot com, thanks.

Java Source Code

/*
 * Copyright (C) 2013 The Android Open Source Project
 *// www .ja  v a2s .c o m
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.sunny.cache;

import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.drawable.BitmapDrawable;

/**
 * A BitmapDrawable that keeps track of whether it is being displayed or cached.
 * When the drawable is no longer being displayed or cached,
 * {@link android.graphics.Bitmap#recycle() recycle()} will be called on this
 * drawable's bitmap.
 */
public class RecyclingBitmapDrawable extends BitmapDrawable {

  static final String LOG_TAG = "RecyclingBitmapDrawable";

  private int mCacheRefCount = 0;
  private int mDisplayRefCount = 0;

  private boolean mHasBeenDisplayed;

  public RecyclingBitmapDrawable(Resources res, Bitmap bitmap) {
    super(res, bitmap);
  }

  /**
   * Notify the drawable that the displayed state has changed. Internally a
   * count is kept so that the drawable knows when it is no longer being
   * displayed.
   * 
   * @param isDisplayed
   *            - Whether the drawable is being displayed or not
   */
  public void setIsDisplayed(boolean isDisplayed) {
    synchronized (this) {
      if (isDisplayed) {
        mDisplayRefCount++;
        mHasBeenDisplayed = true;
      } else {
        mDisplayRefCount--;
      }
    }

    // Check to see if recycle() can be called
    checkState();
  }

  /**
   * Notify the drawable that the cache state has changed. Internally a count
   * is kept so that the drawable knows when it is no longer being cached.
   * 
   * @param isCached
   *            - Whether the drawable is being cached or not
   */
  public void setIsCached(boolean isCached) {
    synchronized (this) {
      if (isCached) {
        mCacheRefCount++;
      } else {
        mCacheRefCount--;
      }
    }

    // Check to see if recycle() can be called
    checkState();
  }

  private synchronized void checkState() {
    // If the drawable cache and display ref counts = 0, and this drawable
    // has been displayed, then recycle
    if (mCacheRefCount <= 0 && mDisplayRefCount <= 0 && mHasBeenDisplayed
        && hasValidBitmap()) {
      getBitmap().recycle();
    }
  }

  private synchronized boolean hasValidBitmap() {
    Bitmap bitmap = getBitmap();
    return bitmap != null && !bitmap.isRecycled();
  }

}




Java Source Code List

com.sunny.cache.BaseLoadListener.java
com.sunny.cache.CacheWorker.java
com.sunny.cache.DiskLruCache.java
com.sunny.cache.FileLastModifSort.java
com.sunny.cache.GIFDecoder.java
com.sunny.cache.IDownloadHandler.java
com.sunny.cache.MemoryCache.java
com.sunny.cache.OnSetImageListener.java
com.sunny.cache.RecyclingBitmapDrawable.java
com.sunny.cache.ThumbnailLoader.java
com.sunny.net.DHttpClient.java
com.sunny.net.ProxyUtil.java
com.sunny.threadpool.AbstractCommand.java
com.sunny.threadpool.CommandFactory.java
com.sunny.threadpool.DThreadPool.java
com.sunny.threadpool.IDThreadPool.java
com.sunny.threadpool.IPriorityTask.java
com.sunny.threadpool.ITaskHandler.java
com.sunny.threadpool.PriorityTask.java
com.sunny.threadpool.PriorityThreadFactory.java
com.sunny.threadpool.TaskPriority.java
com.sunny.util.ImageUtil.java
com.sunny.util.MD5Util.java
com.sunny.util.Utils.java