2013-03-06 3 views
-1

Я разрабатываю приложение, которое получает URL-адреса изображений с сервера. Я должен использовать этот url и установить фон изображения. Все отлично работает 15-20 мин. После этого приложение разбилось.Как преодолеть OutOfMemoryError

03-06 18: 35: 43,871: E/GraphicsJNI (22189): VM не позволит нам выделить 93000 байт

Он показывает эту линию в LogCat когда произошла эта ошибка , Любое решение?

+0

@downvoter, в чем ошибка в этом вопросе? –

ответ

1

После того, как вы используете Bitmap с, вы должны recycle() их. Кроме того, оберните все ваши битмапы в WeakReference s, чтобы позволить сборщику мусора легче освободить ресурсы.

Приложения для Android имеют очень строгую ограниченность памяти, которая легко достигается при выполнении гимнастики с помощью Bitmap.

+0

Я взял изображения в виде растровых изображений и собрал все растровые изображения в векторе. когда я перехожу к следующему действию, я перерабатываю все растровые изображения в ondestroy(). Все отлично. когда я пытаюсь вернуться к предыдущей деятельности, тогда приложение разбилось !! ** 03-07 11: 51: 07.605: E/AndroidRuntime (1192): java.lang.RuntimeException: Canvas: пытается использовать переработанную растровую карту [email protected]** –

+0

Пожалуйста, расскажите, как обернуть все растровые изображения в weakReferences, позволяющий GC легко освобождать ресурсы. Любой ** код ** относительно этого? –

+0

@muralidumpala Вы не можете использовать битмапы, которые вы уже переработали. Используйте 'WeakReference ' вместо 'Bitmap'. – poitroae

1

Причина этого происходит из-за того, что вы устанавливаете огромные снимки на ваш ImageView до тех пор, пока у вас не закончится память.

Что вы должны сделать, это создать миниатюру этой фотографии и применить ее к ImageView. и показать полное изображение только тогда, когда на него щелкнул или не покажет его ImageView.

вы могли бы использовать этот метод, чтобы получить эскиз изображения из файла, но вы должны сохранить изображение первого на устройстве в файл объекта:

public static Bitmap decodeSampledBitmapFromFile(String path, 
     int reqWidth, int reqHeight) { // BEST QUALITY MATCH 

    // First decode with inJustDecodeBounds=true to check dimensions 
    final BitmapFactory.Options options = new BitmapFactory.Options(); 
    options.inJustDecodeBounds = true; 
    BitmapFactory.decodeFile(path, options); 

    // Calculate inSampleSize 
     // Raw height and width of image 
     final int height = options.outHeight; 
     final int width = options.outWidth; 
     options.inPreferredConfig = Bitmap.Config.RGB_565; 
     int inSampleSize = 1; 

     if (height > reqHeight) { 
      inSampleSize = Math.round((float)height/(float)reqHeight); 
     } 

     int expectedWidth = width/inSampleSize; 

     if (expectedWidth > reqWidth) { 
      //if(Math.round((float)width/(float)reqWidth) > inSampleSize) // If bigger SampSize.. 
      inSampleSize = Math.round((float)width/(float)reqWidth); 
     } 


    options.inSampleSize = inSampleSize; 

    // Decode bitmap with inSampleSize set 
    options.inJustDecodeBounds = false; 

    return BitmapFactory.decodeFile(path, options); 
} 
+0

У меня есть listview, у которого есть изображения в каждой строке. Я беру Url, а затем получаю растровое изображение из url и устанавливаю ** bitmap ** в ImageView. Он отлично работает на 10-20 мин. Затем приложение ** Crashed **. –

+0

@muralidumpala, я понял вашу проблему ... вы прочитали мой ответ? –

+0

Я прочитал ваш ответ. Я также масштабировал растровое изображение. Все еще приложение разбилось. Сейчас я использую WeakReferences . –

0

Вы должны убедиться, что вы правильно и распоряжаться если вы не используете слишком большие изображения или остаетесь в памяти. Смотрите эту документацию по андроиду

http://developer.android.com/reference/android/app/Application.html#onLowMemory%28%29

Вы можете переопределить метод onLowMemory() для управления использованием памяти.

+0

Привет, Ниль, спасибо за ответ. Я думаю, onLowMemory() работает только тогда, когда устройство работает вне памяти не для приложения. –

Смежные вопросы