Android BitmapDrawable приводит к нехватке памяти

В основном у меня 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 ответ

Решение

Вы пытаетесь выделить 50 МБ оперативной памяти в куче, что слишком много для устройства на платформе Android. Если это действительно необходимо, вы можете добавить:

  android:largeHeap="true"

в <application> часть вашего манифеста. Но это обычно не рекомендуемое решение. Большинству приложений это не нужно, и вместо этого следует сосредоточиться на снижении общего использования памяти для повышения производительности. Включение этого также не гарантирует фиксированное увеличение доступной памяти, потому что некоторые устройства ограничены их общей доступной памятью.


Правильное решение:

Вам нужно посмотреть, сколько изображений вы открываете и насколько они велики. Обратите внимание, что очень распространенное заблуждение состоит в том, что люди обычно предполагают, что размер файла - это то, что используется в памяти. Это очень неправильное предположение. PNG, JPG и т. Д. Имеют сжатый формат. Когда вы загружаете изображение на ваше устройство, каждый пиксель составляет 4 байта. Если у вас есть изображение размером 2000x2000 пикселей, при загрузке оно потребляет 16 МБ ОЗУ, что обычно является высоким пределом для типичных (неигровых) приложений.

Другие вопросы по тегам