Android BitmapDrawable导致内存不足

时间:2015-03-01 05:21:16

标签: android android-bitmap bitmapdrawable

基本上我在UI中有4 ImageView,我想将图像设置为它们。以下是相关代码:

private void showPhoto() {
    // (re)set the image button's image based on our photo
    Photo p = mCrime.getPhoto();
    BitmapDrawable b = null;
    if (p != null) {
        String path = getActivity()
            .getFileStreamPath(p.getFilename()).getAbsolutePath();
        Log.i(TAG,"shown picture name is: "+p.getFilename());
//            b = PictureUtils.getScaledDrawable(getActivity(), path);


           // Log.i(TAG,"entered!");
        if (cachedImageNames.size()==0)
            cachedImageNames.add(0,path);
        else{
            boolean isExisted = false;
            for (String imagePath: cachedImageNames){
                if (imagePath.equals(path)){
                    isExisted = true;
                    break;
                    //cachedImageNames.add(0,path);

                }
            }
            if (!isExisted)
                cachedImageNames.add(0,path);
        }


    }
    mCrimes = CrimeLab.get(getActivity()).getCrimes();
//        mPhotoView.setImageDrawable(b);

    Log.i(TAG,"image names' list size is: "+cachedImageNames.size());

    if(!(cachedImageNames.size()<imageViews.size())){
        for (int i=0; i<imageViews.size(); i++){

            b= PictureUtils.getScaledDrawable(getActivity(), cachedImageNames.get(i));
            imageViews.get(i).setImageDrawable(b);
        }
    }
    else{
        for (int i=0; i<cachedImageNames.size(); i++){
            b= PictureUtils.getScaledDrawable(getActivity(), cachedImageNames.get(i));
            imageViews.get(i).setImageDrawable(b);
        }
    }

}

在控制台中,表示此行:

b= PictureUtils.getScaledDrawable(getActivity(),cachedImageNames.get(i));

导致了这样的错误:

 java.lang.OutOfMemoryError: Failed to allocate a 51916812 byte allocation with 16777216 free bytes and 36MB until OOM 

我真的很新android ...有什么建议吗?

1 个答案:

答案 0 :(得分:1)

你正在尝试在堆上分配50MB的ram,这对Android设备来说太过分了。如果真的有必要,可以添加:

  android:largeHeap="true"

在清单的<application>部分。但这通常是不推荐的解决方案。大多数应用程序不应该需要这个,而应该专注于减少其整体内存使用量以提高性能。启用此功能也不能保证可用内存的固定增加,因为某些设备受其总可用内存的限制。


正确的解决方案:

您需要查看您要打开多少张图片以及它们有多大。请注意,一个非常常见的误解是人们通常认为文件大小是在内存中使用的内容。这是一个非常错误的假设。 PNG,JPG等是压缩格式。在设备上加载图像时,每个像素为4个字节。如果你有一个2000x2000像素的图像,加载时,它会消耗16MB的RAM - 这通常是典型(非游戏)应用程序的一个上限。