2012-02-06 2 views
0

Приложение для планшета должно отображать очень большое изображение (2500x6000) и разрешать пользователю перемещаться, увеличивать &. Так как он не может вписаться в память, я разбил его на плитки и загружаю их по мере необходимости. Проблема, с которой я сталкиваюсь, заключается в том, что всякий раз, когда я выгружаю или заменяю растровое изображение, я вызываю сбор мусора, который приостанавливает мое приложение с заметным заиканием. Мне было интересно, если кто-нибудь придумал какие-нибудь умные способы обойти это? Я создаю свои растровые изображения, используя BitmapFactory.decodeResource. Я попытался заменить одно и то же растровое изображение, но сбор мусора все еще выполняется (при условии, что он выгружает старое растровое изображение и заменяет его новым).Пытается отображать большое изображение в виде плит без икоты

Спасибо!

ответ

1

Выяснил ответ! В API11 + BitmapFactory.Options есть атрибут, называемый inBitmap, который будет повторно использовать растровое изображение при загрузке содержимого. Я внедрил его как таковое:

mBg[i] = Bitmap.createBitmap(800, 1232, Bitmap.Config.RGB_565); 
mBgOptions[i] = new BitmapFactory.Options(); 
mBgOptions[i].inBitmap = mBg[i]; 
mBgOptions[i].inPreferredConfig = Bitmap.Config.RGB_565; 
mBgOptions[i].inMutable = true; 
mBgOptions[i].inSampleSize = 1; 

Сборщик мусора больше не работает и паузы были удалены. Как f.y.i, inSampleSize должен быть установлен или он не будет работать.

0

Если вы ориентируетесь Android 3.0, этот ответ может помочь:

Pre-Android 3.0 вы можете создать HTML страницу вашего плиточных изображений и пусть встроенный браузер обрабатывать нагрузку и выгружать изображения. Мой ответ здесь есть еще некоторые детали:

Кто-нибудь еще есть какие-либо альтернативные подходы?

+0

Загрузка плиток на самом деле не проблема ... за исключением бит мусора, и я не думаю, что другой подход изменит это. Я могу попробовать браузер, но я не думаю, что веб-представление действительно будет работать для поведения, которое мы пытаемся получить. – anakin78z

0

Вы используете андроид: largeHeap = "true"? Это может уменьшить частоту GC. Также, учитывая, что вы ориентируетесь на планшеты, вы можете с уверенностью предположить, что имеете дело с одновременным сборщиком мусора. Таким образом, он будет работать лучше всего, если у него будет больше, меньших блоков памяти для сбора, т. Е. Меньших фрагментов.

+0

Спасибо за информацию. Я не использую андроид: largeHeap = "true" ... Мне нужно будет изучить это. Я также попробую использовать меньшие куски. – anakin78z

0

Я использовал это легко integerate источник применения WorldMap:

https://github.com/johnnylambada/WorldMap

Это использует огромное изображение карты мира, и использует кэш для отображения карты.

Чтобы интегрировать, я просто скопировал все java-файлы (предположим, 5) и использовал surfaceView в своем файле макета. Затем я просмотрел небольшой метод OnCreate() ImageViewerActivity.java и использовал код в своей деятельности (с изменением слайда, в зависимости от моего личного использования).

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