0

私のアプリケーションには、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);


}
4

1 に答える 1

0

アクティビティごとに imageView があると仮定します。一部のアクティビティとそれに関連付けられたビューは破棄されていないと思います。したがって、ImageViews はビットマップへの参照を維持します。したがって、imageViews は下にあるビットマップへの強い参照を持っているため、bitmapRef.get() は null を返しません。

この仮説を確認するには、ヒープ ダンプを試してメモリの蓄積を確認します。

Android ==> メモリ分析 ==> Eclipse メモリ アナライザー?

それが役立つことを願っています!

于 2013-03-01T18:06:24.453 に答える