0

Я пишу «очень длинную прокрутку». Основной элемент игры - ScrollView, который я заполняю «блоками».Android - Получение OutOfMemory при заполнении ScrollView

Один "блок" выглядит следующим образом:


<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:orientation="vertical"> 
    <ImageView 
     android:id="@+id/sec3" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     android:background="@drawable/_40" /> 
</LinearLayout> 

(.jpg, 720x6000) размер изображения, является 800-900kb. я заполняю мой Scrollview со следующим кодом (для одного типа изображений):


View block_3 = inflater.inflate(R.layout.block_3, null); 

    for (int i = 0; i != Blocks.block_20; i++) { //Filling the LinearLayout in ListView with 20 blocks 
     LinLayout_in_ScrollView.addView(block_3, layout_params); 
    } 

Но мое приложение аварий с OutOfMemory ошибки. Я попытался использовать ListView вместо ScrollView, но я потерпел неудачу. Я думал о динамической загрузке элементов в ScrollView, но это будет очень сложно сделать. Итак, как я могу избежать исключения OutOfMemoryException?

P.S. Извините за мой английский, пожалуйста.

+1

вам нужно использовать 'ListView' –

+0

Вы должны использовать' ListView' с 'LazyLoading'. Что вы имеете в виду, когда вы использовали «ListView»? Вы получаете ошибки? –

ответ

0

Недостаточно памяти Исключение является одним из самых распространенных и самых сложных в обращении при обращении с изображениями. Вы можете взглянуть на это: http://developer.android.com/training/displaying-bitmaps/load-bitmap.html#load-bitmap и http://developer.android.com/training/displaying-bitmaps/index.html. В учебниках рассказывается, как эффективно загружать растровые изображения/изображения, а также некоторые образцы. Возможно, вы захотите это увидеть: Out of Memory Exception while scroll Listview?

+0

Спасибо за быстрый ответ! Но мой ScrollView содержит> 2000 элементов, поэтому я не думаю, что эффективная загрузка Bitmap может мне помочь. – enCrypter

+0

хорошо в случае, если вы захотите перепроектировать приложение, потому что, если у вашего scrollview есть> 2000 изображений, тогда будут проблемы с исключением OOM – user2511882

+0

Ссылка, которую я опубликовал, применима также для эффективной загрузки изображений – user2511882

0

Подход, который вы принимаете, может ввести другие проблемы, а также исключения OOM. Я бы настоятельно предложил вам взглянуть на пример JetBoy, представленный в Android SDK. В начале, вы, вероятно, захотите посмотреть на использование SurfaceView вместо ScrollView

0

Проблема заключается в том, что все изображения необходимо вставлять в память одновременно. Легко поверить, что в изображениях используется столько же памяти, сколько файлы jpg, но они декодируются при загрузке в память и, вероятно, будут использовать около 4 Мбайт памяти в каждом случае (если мои быстрые вычисления верны).

Я бы порекомендовал вам не использовать ScrollView. Либо рисуйте свою графику, используя Canvas, либо используя OpenGL. Очень вероятно, что вам нужно будет использовать OpenGL, чтобы получить хорошую производительность в режиме прокрутки в режиме реального времени (даже если это «только» 2D). Если вам нужно много изображений, тогда вам нужно быть очень осторожными, чтобы не загружать слишком много в память сразу (без освобождения памяти для других изображений). В некоторых случаях полезно использовать обработку изображений и рендеринг в собственном коде, используя JNI и Android NDK, потому что иногда трудно получить хорошую производительность в реальном времени в Java на Android без зависания мусора и подобных при загрузке многих изображений.

OpenGL требует определенной работы, чтобы узнать (если вы этого не знаете), но я бы рекомендовал вам изучить его. Посмотрите here на обзор OpenGL ES на Android. Это позволит вам получить отличную производительность на широком спектре устройств. На мой взгляд, это очень важно изучить.

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