Размер растрового изображения ошибки внешней памяти Android превышает бюджет vm в 2.3.3 - PullRequest
11 голосов
/ 21 марта 2011

Я понимаю, что этот вопрос задают несколько раз. Ни одно из них не ясно из решения. Позвольте мне объяснить проблему.

  1. У меня есть активность, которая загружает 4 изображения одновременно.
  2. Я загружаю изображения в методе onResume ().
  3. Активность выдает ошибку растрового изображения при загрузке.

Примечание.

  1. Я устанавливаю изображение, используя вызов метода setImageResource (R.drawable.xxxx), а не напрямую растровое / рисованное изображение.
  2. Изображения масштабируются правильно.
  3. Активность WORKS FINE во всех эмуляторах до версии 2.3 и WORKING FINE в актуальном устройстве (Samsung Galaxy 5)
  4. Ошибка появляется при первой инициализации, и событие изменения ориентации не запускается.
  5. изображения имеют размер 800 x 600 и в среднем по 15 КБ (каждое).

Дайте мне знать любые решения. Также дайте мне знать, если у вас есть похожие проблемы с эмулятором Android 2.3.3.

[обновление] -snippets

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
            ...
    img_topLeft = (ImageView) findViewById(R.id.Img_Alph_Q_TopLeft);
    img_topRight = (ImageView) findViewById(R.id.Img_Alph_Q_TopRight);
    img_bottomLeft = (ImageView) findViewById(R.id.Img_Alph_Q_BottomLeft);
    img_bottomRight = (ImageView) findViewById(R.id.Img_Alph_Q_BottomRight);
   ...
   }
protected void onResume() {
    super.onResume();
            img_topLeft.setImageResource(R.drawable.xxx);
            img_topRight.setImageResource(R.drawable.xxx);
            img_bottomLeft.setImageResource(R.drawable.xxx);
            img_bottomRight.setImageResource(R.drawable.xxx);
   ...
   }

03-21 08: 59: 17.362: ОШИБКА / dalvikvm-heap (5883): внешнее выделение 4320000 байт слишком велико для этого процесса. 03-21 08: 59: 17.412: ОШИБКА / GraphicsJNI (5883): ВМ не позволяет выделять 4320000 байт 03-21 08: 59: 17.432: ОШИБКА / AndroidRuntime (5883): ИСКЛЮЧИТЕЛЬНОЕ ИСКЛЮЧЕНИЕ: основное 03-21 08: 59: 17.432: ОШИБКА / AndroidRuntime (5883): java.lang.OutOfMemoryError: размер растрового изображения превышает бюджет виртуальной машины 03-21 08: 59: 17.432: ОШИБКА / AndroidRuntime (5883): на android.graphics.Bitmap.nativeCreate (собственный метод) 03-21 08: 59: 17.432: ОШИБКА / AndroidRuntime (5883): на android.graphics.Bitmap.createBitmap (Bitmap.java:477) 03-21 08: 59: 17.432: ОШИБКА / AndroidRuntime (5883): на android.graphics.Bitmap.createBitmap (Bitmap.java:444) 03-21 08: 59: 17.432: ОШИБКА / AndroidRuntime (5883): на android.graphics.Bitmap.createScaledBitmap (Bitmap.java:349) 03-21 08: 59: 17.432: ОШИБКА / AndroidRuntime (5883): на android.graphics.BitmapFactory.finishDecode (BitmapFactory.java:498) 03-21 08: 59: 17.432: ОШИБКА / AndroidRuntime (5883): на android.graphics.BitmapFactory.decodeStream (BitmapFactory.java:473) 03-21 08: 59: 17.432: ОШИБКА / AndroidRuntime (5883): на android.graphics.BitmapFactory.decodeResourceStream (BitmapFactory.java:336) 03-21 08: 59: 17.432: ОШИБКА / AndroidRuntime (5883): на android.graphics.drawable.Drawable.createFromResourceStream (Drawable.java:697) 03-21 08: 59: 17.432: ОШИБКА / AndroidRuntime (5883): на android.content.res.Resources.loadDrawable (Resources.java:1709) 03-21 08: 59: 17.432: ОШИБКА / AndroidRuntime (5883): на android.content.res.Resources.getDrawable (Resources.java:581) 03-21 08: 59: 17.432: ОШИБКА / AndroidRuntime (5883): на android.widget.ImageView.resolveUri (ImageView.java:501) 03-21 08: 59: 17.432: ОШИБКА / AndroidRuntime (5883): на android.widget.ImageView.setImageResource (ImageView.java:280) 03-21 08: 59: 17.432: ОШИБКА / AndroidRuntime (5883): в Quiz.java:124) 03-21 08: 59: 17.432: ОШИБКА / AndroidRuntime (5883): Quiz.onResume (Quiz.java:92) 03-21 08: 59: 17.432: ОШИБКА / AndroidRuntime (5883): на android.app.Instrumentation.callActivityOnResume (Instrumentation.java:1150) 03-21 08: 59: 17.432: ОШИБКА / AndroidRuntime (5883): на android.app.Activity.performResume (Activity.java:3832) 03-21 08: 59: 17.432: ОШИБКА / AndroidRuntime (5883): на android.app.ActivityThread.performResumeActivity (ActivityThread.java:2110) 03-21 08: 59: 17.432: ОШИБКА / AndroidRuntime (5883): на android.app.ActivityThread.handleResumeActivity (ActivityThread.java:2135) 03-21 08: 59: 17.432: ОШИБКА / AndroidRuntime (5883): на android.app.ActivityThread.handleLaunchActivity (ActivityThread.java:1668) 03-21 08: 59: 17.432: ОШИБКА / AndroidRuntime (5883): на android.app.ActivityThread.access $ 1500 (ActivityThread.java:117) 03-21 08: 59: 17.432: ОШИБКА / AndroidRuntime (5883): на android.app.ActivityThread $ H.handleMessage (ActivityThread.java:931) 03-21 08: 59: 17.432: ОШИБКА / AndroidRuntime (5883): на android.os.Handler.dispatchMessage (Handler.java:99)03-21 08: 59: 17.432: ОШИБКА / AndroidRuntime (5883): на android.os.Looper.loop (Looper.java:123) 03-21 08: 59: 17.432: ОШИБКА / AndroidRuntime (5883): на android.app.ActivityThread.main (ActivityThread.java:3683) 03-21 08: 59: 17.432: ОШИБКА / AndroidRuntime (5883): на java.lang.reflect.Method.invokeNative (собственный метод) 03-21 08: 59: 17.432: ОШИБКА / AndroidRuntime (5883): в java.lang.reflect.Method.invoke (Method.java:507) 03-21 08: 59: 17.432: ОШИБКА / AndroidRuntime (5883): на com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:839) 03-21 08: 59: 17.432: ОШИБКА / AndroidRuntime (5883): на com.android.internal.os.ZygoteInit.main (ZygoteInit.java:597) 03-21 08: 59: 17.432: ОШИБКА / AndroidRuntime (5883): в dalvik.system.NativeStart.main (собственный метод)

Спасибо. Удалось решить это. Поделиться кодом для пользы других Пользовательский класс, который решил эту проблему. на основе ссылки @ Janardhanan.S.

public class BitmapResizer {

public static Bitmap decodeImage(Resources res, int id ,int requiredSize){
    try {
        BitmapFactory.Options o = new BitmapFactory.Options();
        o.inJustDecodeBounds = true;
        BitmapFactory.decodeResource(res, id, o);

        //Find the correct scale value. It should be the power of 2.
        final int REQUIRED_SIZE=requiredSize;
        int width_tmp=o.outWidth, height_tmp=o.outHeight;
        int scale=1;
        while(true){
            if(width_tmp/2<REQUIRED_SIZE || height_tmp/2<REQUIRED_SIZE)
                break;
            width_tmp/=2;
            height_tmp/=2;
            scale*=2;
        }

        //decode with inSampleSize
        BitmapFactory.Options o2 = new BitmapFactory.Options();
        o2.inSampleSize=scale;
        return BitmapFactory.decodeResource(res, id, o2);
    } catch (Exception e) {

    }
    return null;
}

}

//Class call
int requiredsize = 100; // Still playing around with this number to find the optimum value
img_topLeft.setImageBitmap(BitmapResizer.decodeImage(getResources(),
        AlphResourceSet.R.drawable.xxx, requiredsize));

Ответы [ 3 ]

3 голосов
/ 21 марта 2011

Растровое изображение занимает много места в памяти. не создавайте новую переменную растрового изображения для всего изображения, которое вы загружаете во время активности, вместо этого вы можете создать одну растровую переменную и использовать их столько, сколько сможете.

Вы можете использовать этот фрагмент для изменения размера растрового изображения

http://pastebin.com/D8vbQd2u

0 голосов
/ 21 марта 2011

Кажется, изображения очень тяжелые по своей природе.Я рекомендую запустить AsyncTimer, который фактически возвращает экземпляр растрового изображения, и в doBackground () AsyncTask передать идентификатор изображения и изменить его масштаб до желаемого размера, скажем, 32 x 32, используя метод createScaledBitmap(Bitmap src, int dstWidth, int dstHeight, boolean filter) класса Bitmap.

0 голосов
/ 21 марта 2011

Можете ли вы опубликовать фрагмент кода стека трассировки Activity +.

Вы уже проверили статью Как избежать утечек памяти ?

Особенно следующая часть:

Когда Drawable присоединяется к представлению, представление устанавливается как обратный вызов для Drawable. В приведенном выше фрагменте кода это означает, что drawable имеет ссылку на TextView, который сам имеет ссылку на действие (Context), которое, в свою очередь, имеет ссылки почти на что угодно (в зависимости от вашего кода.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...