Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/344.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Android hashmap clear InImmery不会释放内存_Java_Android_Bitmap_Hashmap_Android Memory - Fatal编程技术网

Java Android hashmap clear InImmery不会释放内存

Java Android hashmap clear InImmery不会释放内存,java,android,bitmap,hashmap,android-memory,Java,Android,Bitmap,Hashmap,Android Memory,我有一个位图的hashmap,它为adapterview提供了需要显示的THMBnail图像 我的缩略图大小可能在64x64 dp框内 但我仍然看到像heap这样的日志为1.xx mb的分配而增长。然后我打印字节数,并验证我使用的代码实际上没有进行缩略图。结果位图的大小大多大于兆字节 我使用的代码如下 @Override protected Bitmap doInBackground(Uri... params) { data = params[0];

我有一个位图的hashmap,它为adapterview提供了需要显示的THMBnail图像

我的缩略图大小可能在64x64 dp框内

但我仍然看到像heap这样的日志为1.xx mb的分配而增长。然后我打印字节数,并验证我使用的代码实际上没有进行缩略图。结果位图的大小大多大于兆字节

我使用的代码如下

@Override
        protected Bitmap doInBackground(Uri... params) {
            data = params[0];
      //      Log.e(TAG,"Async Task Drawable doInBackground");
            try {
                Bitmap bmp;
                if (MainActivity.thumbCache.containsKey(albumId)) {
                    bmp = (Bitmap) MainActivity.thumbCache.get(albumId);
                    Log.e("BMWT-HM-Size","getting from Cache"+String.valueOf(MainActivity.thumbCache.size()));
                    Log.e(TAG,": bmp.getByteCount() "+bmp.getByteCount());
                } else {
                in = res.openInputStream(data);
                songArtOptions.inJustDecodeBounds = true;
                BitmapFactory.decodeStream(in,null,songArtOptions);
                Log.e(TAG,String.valueOf(songArtOptions.outWidth)+"x"+String.valueOf(songArtOptions.outHeight)+": "+songArtOptions.outMimeType);
                songArtOptions.inSampleSize = calculateInSampleSize(songArtOptions,songArtWidth,songArtHeight);
                Log.e(TAG,"subSampleLevel = "+String.valueOf(songArtOptions.inSampleSize));

                in = res.openInputStream(data); 
                songArtOptions.inJustDecodeBounds = false;
                bmp =  BitmapFactory.decodeStream(in,null,songArtOptions);

                MainActivity.thumbCache.put(albumId, bmp);
                Log.e("BMWT-HM-Size","newly decoded"+String.valueOf(MainActivity.thumbCache.size()));
                Log.e(TAG,": bmp.getByteCount() "+bmp.getByteCount());
                }
                return bmp;
            } catch (FileNotFoundException e) {
                return defaultArt; 
            }
        }



public static int calculateInSampleSize(
            BitmapFactory.Options options, int reqWidth, int reqHeight) {
    int inSampleSize = 1;

        if (options.outHeight > reqHeight || options.outWidth > reqWidth) {

            int halfHeight = options.outHeight >> 1;
            int halfWidth = options.outWidth >> 1;

            // Calculate the largest inSampleSize value that is a power of 2 and
            // keeps both
            // height and width larger than the requested height and width.

            while (halfWidth > reqWidth && halfHeight > reqHeight) {
                inSampleSize <<= 1;
                halfWidth >>= 1;
                halfHeight >>= 1;
            }
        }

    return inSampleSize;
}
因此,我的堆随着图像放入hashmap而增长

在InControl中,我调用了thumbCache.clear,我希望它能释放hashmap元素占用的内存,但它没有。堆状态保持不变


如何清理这个。只要视图可见,我就要维护缓存,并要清除缓存,这意味着在视图完全破坏时释放要GC’ed的占用内存。

如果您确定位图没有其他用途,可以调用Bitmap.recycle在从缓存中删除内存后回收内存。

您的意思是,迭代thumbCache映射的每个键并调用recycle方法?是的,如果要清除thumbCache并且不再使用位图,可以这样做。