2013-04-30 1 views
0

Для моего приложения в настоящее время я просматриваю ВСЕ файлы изображений (JPEG), хранящиеся на телефоне, и сохраняю их идентификатор и миниатюры (НЕ исходное растровое изображение) на HashMap.Сколько эскизов можно сохранить до тех пор, пока у меня не закончится память?

Код:

final String[] PROJECTION = 
       new String[] {MediaStore.Images.Media._ID}; 

Cursor pictureCursor = getContentResolver().query(Images.Media.EXTERNAL_CONTENT_URI, 
       PROJECTION, null, null, MediaStore.Images.Media._ID); 

HashMap<Integer,Bitmap> thumbnails = new HashMap<Integer,Bitmap>(); 

int id; 
int id_index = pictureCursor.getColumnIndex(MediaStore.Images.Media._ID); 

int THUMBNAIL_TYPE = MediaStore.Images.Thumbnails.MICRO_KIND; 
ContentResolver content_resolver = context.getContentResolver(); 

while (pictureCursor.moveToNext()) { 

    id = pictureCursor.getInt(id_index); 
    Bitmap thumbnail = MediaStore.Images.Thumbnails.getThumbnail(content_resolver, id, THUMBNAIL_TYPE, null); 
    thumbnails.put(id, thumbnail); 
} 

Сейчас у меня 200 изображений на моем телефоне, и теперь он работает нормально. Но я беспокоюсь, что в определенный момент у приложения закончится память и произойдет сбой.

Заканчивается память что-то, что мне нужно принять во внимание? Или миниатюры достаточно малы, что, на самом деле, приложение не исчерпывает память?

EDIT Если я должен беспокоиться о нехватке памяти, что это лучший способ, если я хочу что-то вроде родной галереи приложения Android, которая, кажется, не имеет кнопку «Загрузить больше изображений», а скорее бесконечную поток изображений?

Благодаря

ответ

1

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

Вы можете рассчитать использование миниатюр в памяти. Не должно быть слишком сложно создать один или два миниатюры и выяснить, насколько они велики. Затем вы можете рассчитать доступную кучу (урожайную кучу на 3.0, Dalvik heap после 3.0) и получить представление о том, сколько вы можете сделать.

Вы можете получить количество элементов в курсор в данный момент в вашем коде:.

Курсор pictureCursor = getContentResolver() запрос (Images.Media.EXTERNAL_CONTENT_URI, проекционные, NULL, NULL, Mediastore. Images.Media._ID); int numberOfImages = pictureCursor.getCount() HashMap thumbnails = new HashMap();

, а затем узнайте, есть ли у вас много места или нет. Если вы ограничены в пространстве, вам нужно будет принять дизайнерское решение - предупредите пользователя о том, что он не будет работать, или посмотрите только на первые «x» изображения, затем освободите их и загрузите другой набор для пользователей запрос.

0

Это зависит от размера кучи и, как большой объем памяти вашего приложения.

Я предлагаю вам взглянуть на видео в ссылке

http://www.youtube.com/watch?v=_CruQY55HOk.

Если вы столкнулись с утечками памяти, вы можете использовать MAT Analyzer для поиска и устранения проблемы.

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

http://developer.android.com/training/articles/perf-tips.html

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