Android Java Gallery из-за ошибки памяти - PullRequest
0 голосов
/ 05 января 2011

Итак, я загружаю изображения в галерею Android с SD-карты. Я нажимаю меню, а затем выбираю, и он вставляется в галерею с помощью кода ниже. Проблема заключается в том, что после примерно 5 или 6 изображений возникает ошибка нехватки памяти 01-04 18: 10: 35.246: ОШИБКА / AndroidRuntime (10220): java.lang.OutOfMemoryError: размер растрового изображения превышает бюджет виртуальной машины решить это?

public class ImageAdapter extends BaseAdapter{  

    int mGalleryItemBackground;  
    public ImageAdapter(Context c)  {     
        mContext = c;     
        TypedArray typArray = obtainStyledAttributes(R.styleable.GalleryTheme);
        mGalleryItemBackground = typArray.getResourceId(R.styleable.GalleryTheme_android_galleryItemBackground, 0);
        typArray.recycle();
    }  
    public int getCount(){  
        return mUrls.length;  
    }  
    public Object getItem(int position){  
        return position;  
    }  
    public long getItemId(int position) {  
        return position;  
    }  
    public View getView(int position, View convertView, ViewGroup parent){  
        ImageView i = new ImageView(mContext);  

        i.setImageURI(mUrls[position]); 
        i.setScaleType(ImageView.ScaleType.FIT_XY);  
        i.setLayoutParams(new Gallery.LayoutParams(120, 120));  
        return i;  
    }     
    private Context mContext;  
    }     

Ответы [ 2 ]

0 голосов
/ 05 января 2011

Старайтесь избегать использования

private Context mContext;

Хранить Context / Activity в качестве закрытых членов классов очень плохо.Контекст / активность рекомендуется использовать только через параметры.Типичным результатом хранения Context является утечка памяти, которая, как мне кажется, демонстрирует ваш код.Подробнее вы можете читать здесь.

0 голосов
/ 05 января 2011

Какова ширина и высота в пикселях изображений, которые вы вставляете в Галерею? Если они очень большие, например, 500x500 или больше, я бы предложил изменить их размер на что-то меньшее и приблизительное к предполагаемому размеру 120x120, прежде чем добавлять их в Галерею.

Вы можете уменьшить их, используя метод Bitmap.createScaledBitmap .

РЕДАКТИРОВАТЬ: обратите внимание, что это отличается от того, что ImageView делает масштабирование. ImageView будет масштабировать растровое изображение так, как оно отображается, но сохраняет исходное растровое изображение в динамической памяти. Если вы используете createScaledBitmap и выбрасываете исходное растровое изображение, тогда вы сэкономите много кучи.

...