как очистить растущую кучу? - PullRequest
1 голос
/ 22 февраля 2012

У меня есть проект, который работает как презентация ImageViews с анимацией их, нажав. Он реализован как ViewFlipper с анимацией go_in и go_out. Каждый ImageView представлен в XML для каждого слайда презентации. Приложение предназначено для вкладок с Android 3.0 и выше. Размер кучи увеличивается с каждым переключением, и logcat выглядит так (до того как dalvik выдает ошибку: oof) ​​...

I/dalvikvm-heap(5313): Grow heap (frag case) to 205.584MB for 3850256-byte allocation
D/dalvikvm(5313): GC_CONCURRENT freed 0K, 1% free 210440K/210759K, paused 2ms+9ms
I/MediaPlayer(5313): prepareAsync called in state 4
D/dalvikvm(5313): GC_FOR_ALLOC freed 166K, 1% free 210478K/210887K, paused 29ms
I/dalvikvm-heap(5313): Grow heap (frag case) to 209.293MB for 3850256-byte allocation
D/dalvikvm(5313): GC_FOR_ALLOC freed <1K, 1% free 214238K/214663K, paused 33ms
D/dalvikvm(5313): GC_CONCURRENT freed <1K, 1% free 214238K/214663K, paused 3ms+10ms
D/dalvikvm(5313): GC_FOR_ALLOC freed 4K, 1% free 214838K/215303K, paused 32ms
I/dalvikvm-heap(5313): Grow heap (frag case) to 213.551MB for 3850256-byte allocation
D/dalvikvm(5313): GC_FOR_ALLOC freed 0K, 1% free 218598K/219079K, paused 33ms
D/dalvikvm(5313): GC_CONCURRENT freed <1K, 1% free 218598K/219079K, paused 1ms+10ms
I/MediaPlayer(5313): prepareAsync called in state 4
D/dalvikvm(5313): GC_FOR_ALLOC freed 7K, 1% free 220438K/220743K, paused 29ms
D/dalvikvm(5313): GC_FOR_ALLOC freed 2K, 1% free 222253K/222535K, paused 29ms
D/dalvikvm(5313): GC_FOR_ALLOC freed <1K, 1% free 222634K/222855K, paused 33ms
I/dalvikvm-heap(5313): Grow heap (frag case) to 221.165MB for 3850256-byte allocation 

ТАК, вопрос - как можно обнулить кучу или перезапустить приложение? Или как организовать приложение так, чтобы оно не увеличивало кучу?

Вот код, который я использовал

ImageView buttonNext_13 = (ImageView)findViewById(R.id.Button_next_13);
buttonNext_13.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view131) {
        flipper.setInAnimation(AnimationUtils.loadAnimation(
            view131.getContext(), R.anim.go_next_in));
        flipper.setOutAnimation(AnimationUtils.loadAnimation(
            view131.getContext(), R.anim.go_next_out));
        flipper.showNext();
        mp_file.release();
        mp_file = MediaPlayer.create(getApplicationContext(), R.raw.theme);
        mp_file.start();
        return;
    }
});
ImageView buttonPrevious_13 = (ImageView)findViewById(R.id.button_preious13);
buttonPrevious_13.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view132) {
        flipper.setInAnimation(AnimationUtils.loadAnimation(
            view132.getContext(), R.anim.go_prev_in));
        flipper.setOutAnimation(AnimationUtils.loadAnimation(
            view132.getContext(), R.anim.go_prev_out));
        flipper.showPrevious();
        return;
    }
});

Ответы [ 3 ]

3 голосов
/ 22 февраля 2012

Пожалуйста, используйте следующий код,

BitmapFactory.Options bfOptions=new BitmapFactory.Options();
bfOptions.inDither=false;                     //Disable Dithering mode
bfOptions.inPurgeable=true;                   //Tell to gc that whether it needs free memory, the Bitmap can be cleared
bfOptions.inInputShareable=true;              //Which kind of reference will be used to recover the Bitmap data after being clear, when it will be used in the future
bfOptions.inTempStorage=new byte[32 * 1024]; 
CameraTricks.SdCardImage= BitmapFactory.decodeFile(CameraTricks.yu,bfOptions);

CameraTricks.yu - мой путь к растровому изображению

2 голосов
/ 22 февраля 2012

Кажется, у тебя течет память.Таким образом, решение состоит в том, чтобы прекратить делать это.И тут начинается самое сложное: фактически остановить утечку памяти.Поскольку память увеличивается во время переключения представлений, наиболее вероятной причиной является то, что вы неправильно обрабатываете ссылки при запуске и остановке представлений.Покажите больше кода, тогда мы сможем вам помочь

0 голосов
/ 22 февраля 2012

когда изображение становится невидимым, удалите его из памяти, используя drawable.setCallback(null);

вы можете удалить его из ImageView вот так imageView.getDrawable().setCallback(null);

...