2016-07-17 5 views
0

им получение отказа от ошибки памяти только occasionall при использовании следующего кодаAndroid Из памяти небольшого растрового изображения

public class MyActivity extends Activity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    requestWindowFeature(Window.FEATURE_NO_TITLE); 
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, 
      WindowManager.LayoutParams.FLAG_FULLSCREEN); 
    getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); 

    // CODE FOR PUTTING BITMAP ON BACKGROUND 
    String pathName = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES).toString() 
      + "/Backgrounds/0.png"; 
    Resources res = getResources(); 
    Bitmap bitmap = BitmapFactory.decodeFile(pathName); 
    BitmapDrawable bd = new BitmapDrawable(res, bitmap); 
    View view = findViewById(R.id.screen1); 
    view.setBackgroundDrawable(bd); 
    } 

растровое изображение только 310k и его то же растровое на всю свою деятельность (в 10)

Это происходит, когда происходит быстрое переключение из одной активности в другую.

любые идеи, как сделать его более эффективным?

любая помощь

Марк

+0

'растровое изображение - только 310k'. Вы имеете в виду, что «файл png - всего 310 КБ» !? Растровое изображение будет занимать гораздо больше памяти. – greenapps

+0

310kb - * сжатый * размер вашего изображения png. когда он загружается в память, он называется ** в памяти ** размером и может быть другим (как правило, больше). Что вызывает OOM ** в памяти ** размер вашего растрового изображения. Вы должны проверить, сколько памяти вы пытаетесь выделить. Предложение: Используйте библиотеки загрузки изображений для Android. –

+0

Вы можете добавить "System.gc();" чтобы заставить сборщик мусора андроида очистить память. – acac97

ответ

0

Это не имеет значения, насколько велика ваша растровый, скорее всего. Когда вы получаете OOM, это означает, что вся система потеряла память. Например, если у вас есть куча 10 МБ, и я выделяю 9.999 МБ, тогда выделяю 100 байт, 100 байтов будут генерировать исключение (потому что это когда его фактически не хватает памяти). Реальная проблема была первым распределением.

Использование System.gc является ужасным взломом и на самом деле не исправляет вашу проблему - это просто задерживает вас, видя его в лучшем случае. У вас есть утечка памяти. Вам нужно исправить эту утечку памяти, если не сейчас, то в конце концов. Утечка почти наверняка связана с утечкой ссылки на объект Activity. Вернитесь в свое приложение, запустите несколько профилей кучи и выясните, где находится ваша утечка.