私のアプリケーションには、5 つのタブで最大 40 の非常に多くのアクティビティが含まれています。各アクティビティには 1 つの背景画像があります。1 つのアクティビティに入ると、そのアクティビティの背景画像が読み込まれて表示されます。そのアクティビティから離れると、その画像をonDestroy
方法でリサイクルしています。
上記のプロセスは完全に機能しています。つまり、ビットマップのロードとビットマップのリサイクルです。
画像をロードするために、次の手順を使用しています。
イメージ パスにキャッシュ ディレクトリを使用し、イメージ パスをキーとしてビットマップにハッシュ マップを使用しています。
1)最初に画像をロードしているときに、その画像パスでハッシュマップをチェックしています。そこにある場合は、そのビットマップを画像に設定しています。
2) ハッシュ マップにビットマップが含まれていない場合、またはビットマップが既にリサイクルされている場合は、パスの可用性についてキャッシュをチェックしています。
3) キャッシュに含まれている場合、それらの URL ハッシュ コードを使用してビットマップを作成しています。
リサイクルについて:
- 1)その画像パスでハッシュマップをチェックインし、ビットマップをリサイクルしています。
私の問題は
1)数秒でアプリケーションを起動すると、ヒープサイズが25〜30 mbに増加し
OutOfMemeory
、数分で発生します。2)キャッシュとハッシュマップを維持しているにもかかわらず、アクティビティヒープサイズが画像をロードするために増加しています。
ヒープ メモリを最小化する方法や、ビットマップを格納するその他の方法はありますか。
誰でもこの状況に直面する方法を教えてください
以下にいくつかのコードを投稿しています。
よろしくお願いします。
私のコードは:
public ConcurrentHashMap<String, WeakReference<Bitmap>> cache=new ConcurrentHashMap<String, WeakReference<Bitmap>>();
public void DisplayImage(String url,Activity activity, View imageView,int width,int height)
{
this.REQUIRED_WIDTH = width;
this.REQUIRED_HEIGHT = height;
if(cache.containsKey(url) && cache.get(url).get() != null && !cache.get(url).get().isRecycled())
{
if(imageView instanceof ImageView)
{
((ImageView)imageView).setImageBitmap(cache.get(url).get());
}
else
imageView.setBackgroundDrawable(new BitmapDrawable(cache.get(url).get()));
}
else
{
if(cache.containsKey(url))
{
cache.remove(url);
}
queuePhoto(url, activity, imageView);
if(imageView instanceof ImageView)
{
((ImageView)imageView).setBackgroundResource(stub_id);
}
else
{
imageView.setBackgroundColor(Color.parseColor(AppConstants.customCollection.HomeScreen));
}
}
}
public void recycleBitmaps(final String backgroundImageUrl)
{
new Handler().postDelayed(new Runnable()
{
public void run()
{
stopThread();
Vector<WeakReference<Bitmap>> vecBitmapRef = new Vector<WeakReference<Bitmap>>();
if(!cache.isEmpty())
{
if(backgroundImageUrl!=null && !backgroundImageUrl.equalsIgnoreCase(""))
{
WeakReference<Bitmap> bmpref = (WeakReference<Bitmap>)cache.get(backgroundImageUrl);
if(bmpref!=null && bmpref.get()!=null && !bmpref.get().isRecycled())
{
vecBitmapRef.add(cache.remove(backgroundImageUrl));
}
}
Set<String> keys = cache.keySet();
for(String key: keys)
{
vecBitmapRef.add(cache.remove(key));
}
Log.e("Bitmap size", ""+vecBitmapRef.size());
try
{
for(WeakReference<Bitmap> bitmapRef : vecBitmapRef)
{
if(bitmapRef != null && bitmapRef.get() != null)
{
if(!bitmapRef.get().isRecycled())
{
bitmapRef.get().recycle();
bitmapRef.enqueue();
bitmapRef =null;
}
}
Runtime.getRuntime().gc();
}
}
catch (Exception e)
{
// TODO: handle exception
}
vecBitmapRef.clear();
cache.clear();
}
}
},500);
}