Start line:  
End line:  

Snippet Preview

Snippet HTML Code

Stack Overflow Questions
  package com.koushikdutta.ion;
  
  import  android.app.ActivityManager;
  import  android.content.Context;
  import  android.content.res.AssetManager;
  import  android.content.res.Resources;
  import  android.graphics.Bitmap;
  import  android.graphics.BitmapFactory;
  import  android.graphics.drawable.BitmapDrawable;
 import  android.text.TextUtils;
 import  android.util.DisplayMetrics;
 import  android.view.WindowManager;
 
Created by koush on 5/23/13.
 
 public class IonBitmapCache {
     private static DrawableCache<ZombieDrawablemLiveCache = new DrawableCache<ZombieDrawable>();
     private static LruBitmapCache mDeadCache;
     // this cache is simply to maintain a reference to the bitmap
     // so that when the zombie drawable is garbage collected, the bitmap doesn't
     // automatically get collected with it.
     private static HashSet<Bitmap> mAllCache = new HashSet<Bitmap>();
     static Resources mResources;
     static DisplayMetrics mMetrics;
 
     Ion ion;
     public IonBitmapCache(Ion ion) {
         Context context = ion.getContext();
         this. = ion;
          = new LruBitmapCache(getHeapSize(context));
          = new DisplayMetrics();
         ((WindowManager) context.getSystemService(Context.WINDOW_SERVICE))
                 .getDefaultDisplay().getMetrics();
         final AssetManager mgr = context.getAssets();
          = new Resources(mgrcontext.getResources().getConfiguration());
     }
 
     ZombieDrawable put(String key, Bitmap bitmap) {
         if (bitmap == null)
             return null;
         return new ZombieDrawable(keybitmap);
     }
 
     boolean useBitmapScaling = true;
     Bitmap loadBitmapFromStream(InputStream inthrows IOException {
         final int tw = .;
         final int th = .;
         final int targetWidth = tw <= 0 ? . : tw;
         final int targetHeight = th <= 0 ? . : th;
 
         try {
             BitmapFactory.Options o = null;
             if () {
                 o = new BitmapFactory.Options();
                 o.inJustDecodeBounds = true;
                 in.mark(in.available());
                 BitmapFactory.decodeStream(innullo);
                 in.reset();
                 int scale = 0;
                 while ((o.outWidth >> scale) > targetWidth || (o.outHeight >> scale) > targetHeight) {
                     scale++;
                 }
                 o = new BitmapFactory.Options();
                 o.inSampleSize = 1 << scale;
             }
             return BitmapFactory.decodeStream(innullo);
         }
         finally {
             if (in != null) {
                 try {
                     in.close();
                 }
                 catch (IOException e) {
                 }
             }
         }
     }
 
     public BitmapDrawable getDrawable(String key) {
         if (TextUtils.isEmpty(key))
             return null;
 
         ZombieDrawable live = .get(key);
         if (live != null)
             return live.cloneAndIncrementRefCounter();
 
         Bitmap bitmap = .remove(key);
         if (bitmap == null)
             return null;
 
         return new ZombieDrawable(keybitmap);
     }
 
 
    private static int getHeapSize(final Context context) {
        return ((ActivityManager)context.getSystemService(Context.ACTIVITY_SERVICE)).getMemoryClass() * 1024 * 1024;
    }
    private static class Brains {
        int mRefCounter;
        boolean mHeadshot;
        long loadTime = System.currentTimeMillis();
    }
    
ZombieDrawable refcounts Bitmaps by hooking the finalizer.
    class ZombieDrawable extends BitmapDrawable {
        public ZombieDrawable(final String keyfinal Bitmap bitmap) {
            this(keybitmapnew Brains());
        }
        Brains mBrains;
        private ZombieDrawable(final String keyfinal Bitmap bitmapBrains brains) {
            super(bitmap);
            this. = key;
             = brains;
            .add(bitmap);
            .remove(key);
            .put(keythis);
            .++;
        }
        public ZombieDrawable cloneAndIncrementRefCounter() {
            return new ZombieDrawable(getBitmap(), );
        }
        String key;
        @Override
        protected void finalize() throws Throwable {
            super.finalize();
            .--;
            if (. == 0) {
                if (!.)
                    .put(getBitmap());
                .remove(getBitmap());
                .remove();
            }
        }
        // kill this zombie, forever.
        public void headshot() {
            . = true;
            .remove();
            .remove(getBitmap());
        }
    }
New to GrepCode? Check out our FAQ X