2012-01-23 4 views

答えて

1

public enum BitmapLoading { INSTANCE;

private final Map<String, SoftReference<Bitmap>> cache; 
private final ExecutorService pool; 
private Map<ImageView, String> imageViews = Collections.synchronizedMap(new WeakHashMap<ImageView, String>()); 
private Bitmap placeholder; 

BitmapLoading() { 
    cache = new HashMap<String, SoftReference<Bitmap>>(); 
    pool = Executors.newFixedThreadPool(5); 
} 

public void setPlaceholder(Bitmap bmp) { 
    try { 
     placeholder = bmp; 
    } catch (OutOfMemoryError e) { 
     placeholder.recycle(); 
     bmp.recycle(); 
     placeholder = null; 
     bmp = null; 
    } 
} 

public Bitmap getBitmapFromCache(String url) { 
    if (cache.containsKey(url)) { 
     return cache.get(url).get(); 
    } 
    return null; 
} 

public void queueJob(final String url, final ImageView imageView,final int width, final int height) { 
    /* Create handler in UI thread. */ 
    final Handler handler = new Handler() { 
     @Override 
     public void handleMessage(Message msg) { 
      String tag = imageViews.get(imageView); 
      if (tag != null && tag.equals(url)) { 
       if (msg.obj != null) { 
        imageView.setImageBitmap((Bitmap) msg.obj); 
       } else { 
        imageView.setImageBitmap(placeholder); 
        Log.d(null, "fail " + url); 
       } 
      } 
     } 
    }; 
    pool.submit(new Runnable() { 
     @Override 
     public void run() { 
      Bitmap bmp = null; 
      try{ 
       bmp = downloadBitmap(url, width, height); 
       Message message = Message.obtain(); 
       message.obj = bmp; 
       handler.sendMessage(message); 
      }catch (OutOfMemoryError e) { 
       bmp.recycle(); 
       bmp = null; 
      } 
     } 
    }); 
} 

public void loadBitmap(final String url, final ImageView imageView,final int width, final int height) { 
    imageViews.put(imageView, url); 
    Bitmap bitmap = null ; 
    try { 
     bitmap = getBitmapFromCache(url); 
     if (bitmap != null) { 
      imageView.setImageBitmap(bitmap); 
     } else { 
      imageView.setImageBitmap(placeholder); 
      queueJob(url, imageView, width, height); 
     } 
    } catch (OutOfMemoryError e) { 
     bitmap.recycle(); 
     bitmap = null; 
     System.gc(); 
    } 
} 

private Bitmap downloadBitmap(String url, int width, int height) { 
    Bitmap bitmap =null; 
    try { 
     bitmap = BitmapFactory.decodeStream((InputStream) new URL(url).getContent()); 
     bitmap = Bitmap.createScaledBitmap(bitmap, width, height, true); 
     cache.put(url, new SoftReference<Bitmap>(bitmap)); 
     return bitmap; 
    }catch (OutOfMemoryError e) { 
     bitmap.recycle(); 
     bitmap = null; 
     System.gc(); 
    } 
    catch (MalformedURLException e) { 
    } catch (IOException e) { 
    } 
    return null; 
} 

}

+0

私はこのコードがあなたを助けるかもしれないと思います –

0

この問題を解決するには遅延読み込みの概念を使用するか、ビットマップでソフトリファレンスコンセプトを使用する必要があります。

+0

私はそれを試してみましょう。ありがとうございますsenthil – Srinivas

2

これらのリンクは役に立つかもしれません。
http://android-developers.blogspot.com/2009/01/avoiding-memory-leaks.html
また、このリンクは、画像の読み込みを含むリスト/グリッドを実装する際に誰かが単純ではあるが劇的な間違いをどのようにコミットするかを示しています。
How to solve the vm budget memory heap error in lazy loading bitmaps?

また、アクティビティを繰り返し呼び出すときに表示されるように、アダプタのgetViewメソッドで初期化しているスレッドでイメージを読み込んでいる可能性があります。
これは一般的なことですが、私は見て、人々は実装し、同様の問題に遭遇します。
これがあなたのコードで起こっている場合は、もう一度チェックする必要があります。これは、getViewが呼び出されるすべてのリスト行のスレッドの生成につながります。

0

は、実は、このプロジェクトでリストビューで遅延ロードを行う方法の非常に良い例があります:Android Lazy Loading ListView

関連する問題