2013-07-11 2 views
0

У меня есть ImageView, и мне нужно getImageResource() на основе позиции пользователя GPS. Есть 6 изображений, и в качестве расстояния между двумя точками уменьшается я заменяю изображение новым ресурсом.Загрузка ImageView вызывает OutOfMemory

Я тестирую приложение на Galaxy S4, и проблема в том, что после очень небольшого случайного числа загрузки приложение вылетает из-за OutOfMemory.

Есть ли хороший способ кэширования изображений? (Возможно, мне нужно загрузить их с помощью AsyncTask)

Изображения 400x400px png-24 bit с прозрачностью.

Спасибо

+0

Какая из папок drawable-x содержит ваши изображения? – Voicu

+0

Я поместил все в папку mdpi только сейчас. – Emanuele

ответ

0

Galaxy S4, скорее всего, работает с xxhdpi вводимого коэффициента, так что вы положить все в mdpi будет система масштабирования ваших изображений, чтобы соответствовать уровню точек на дюйм S4 в , следовательно, ошибка OutOfMemory. Попробуйте масштабирование и размещение чертежей в соответствующих папках в зависимости от dpi (включая xhdpi и xxhdpi), и после этого, возможно, оптимизируйте свой код.

+0

Я пробовал очень быстро, и кажется, что вы правы. Замена изображения более плавная, а куча растет медленнее (размер уменьшается вдвое). Я постараюсь лучше завтра. Спасибо, сейчас. – Emanuele

1

Попробуйте использовать это:

public static Bitmap decodeSampledBitmapFromResource(String uri, 
     int reqWidth, int reqHeight, int orientation) { 

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

    // Calculate inSampleSize 
    options.inSampleSize = calculateInSampleSize(options, reqWidth, 
      reqHeight); 

    // Decode bitmap with inSampleSize set 
    options.inJustDecodeBounds = false; 
    Bitmap decodeFile = BitmapFactory.decodeFile(uri, options); 
    int rotate = 0; 
    switch (orientation) { 
    case ExifInterface.ORIENTATION_ROTATE_270: 
     rotate = 270; 
     break; 
    case ExifInterface.ORIENTATION_ROTATE_180: 
     rotate = 180; 
     break; 
    case ExifInterface.ORIENTATION_ROTATE_90: 
     rotate = 90; 
     break; 
    } 
    Matrix matrix = new Matrix(); 

    // matrix.postScale(scaleWidth, scaleHeight); 
    matrix.postRotate(rotate); 

    Bitmap rotatedBitmap = Bitmap.createBitmap(decodeFile, 0, 0, 
      decodeFile.getWidth(), decodeFile.getHeight(), matrix, true); 

    return rotatedBitmap; 

} 

private static int calculateInSampleSize(BitmapFactory.Options options, 
     int reqWidth, int reqHeight) { 
    // Raw height and width of image 
    final int height = options.outHeight; 
    final int width = options.outWidth; 
    int inSampleSize = 1; 

    if (height > reqHeight || width > reqWidth) { 
     if (width > height) { 
      inSampleSize = Math.round((float) height/(float) reqHeight); 
     } else { 
      inSampleSize = Math.round((float) width/(float) reqWidth); 
     } 
    } 
    return inSampleSize; 
} 
Смежные вопросы