Android не убивает действия из стека при нехватке памяти

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

Все эти действия содержат списки с несколькими представлениями изображений внутри, и каждое из них занимает около 3 МБ. Если пользователь играет достаточно и создает более 25 действий в стеке, вот что происходит:

  1. Выдается ошибка «Недостаточно памяти» (Куча увеличивается до тех пор, пока не закончится куча ).
  2. Отображается диалоговое окно из-за исключения (К сожалению, %activity% остановлено.)
  3. Активность, в которой была выдана ошибка outofmemerror, завершена.
  4. Все действия в стеке завершены, но история сохраняется, поэтому можно сделать резервную копию, и каждое действие автоматически воссоздается операционной системой.

Я ожидал, что система автоматически убьет самые старые действия в стеке ДО того, как будет выброшена ошибка OutOfMemoryError...

Просто чтобы убедиться, что ОС не убивает старые действия, я создал тестовое приложение, которое каждый раз выделяет 1 МБ. Угадайте, что :Поведение такое же, и выдается outofmemerror:

Вопрос :в том, как мы можем сообщить операционной системе Android, что ей разрешено освобождать действия и ее ресурсы, если это необходимо, чтобы мы не получили сообщение «К сожалению, ваша активность остановлена». диалог?

Подтверждение концепции

    package com.gaspar.memorytest;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

public class MemoryTestActivity extends Activity {
    /** Called when the activity is first created. */

    private byte[] mData;


    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main1);
        ((Button)findViewById(R.id.button)).setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                Intent i = new Intent(MemoryTestActivity.this, MemoryTestActivity.class);
                startActivity(i);
            }
        });  
        mData = new byte[1*1024*1024];
    }
}

8
задан Gaspar de Elias 23 July 2012 в 16:26
поделиться