Android: AlertDialog вызывает утечку памяти

Мое приложение показывает AlertDialog с ListView внутри. Все работало нормально, и я решил проверить это на предмет утечек памяти. После запуска приложения в течение некоторого времени я открыл MAT и сгенерировал отчет о подозреваемых утечках. MAT обнаружил несколько подобных утечек:

Одна экземпляр "com.android.internal.app.AlertController $ RecycleListView" загружен " " занимает ...

Я потратил много времени на поиск причины этой утечки. Проверка кода мне не помогла, и я начал гуглить. Вот что я обнаружил:

Проблема 5054: AlertDialog, похоже, вызывает утечку памяти из-за сообщения в MessageQueue

. Я решил проверить, воспроизводится ли эта ошибка или нет. Для этого я создал небольшую программу, состоящую из двух занятий. MainActivity - это начальная точка. Он содержит только кнопки, которые запускают LeakedActivity . Последний просто показывает AlertDialog в своем методе onCreate () . Вот код:

public class MainActivity extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        findViewById(R.id.button).setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                startActivity(
                    new Intent(MainActivity.this, LeakedActivity.class));
            }
        });
    }
}

public class LeakedActivity extends Activity {
    private static final int DIALOG_LEAK = 0;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        if (savedInstanceState == null) {
            showDialog(DIALOG_LEAK);
        }
    }

    @Override
    protected Dialog onCreateDialog(int id) {
        if (id == DIALOG_LEAK) {
            return new AlertDialog.Builder(this)
                .setTitle("Title")
                .setItems(new CharSequence[] { "1", "2" },
                    new OnClickListener() {
                        private final byte[] junk = new byte[10*1024*1024];

                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            // nothing
                        }
                    })
                .create();
        }
        return super.onCreateDialog(id);
    }
}

MAT сообщает об утечке этого приложения com.android.internal.app.AlertController $ RecycleListView каждый раз, когда AlertDialog закрывается и LeakedActivity

Я не могу найти никаких ошибок в этой маленькой программе. Это выглядит как очень простой случай использования AlertDialog , и он должен работать хорошо, но, похоже, это не так. Поэтому я хотел бы знать, как избежать утечки памяти при использовании AlertDialog с элементами. И почему до сих пор не решена эта проблема? Заранее спасибо.

14
задан Michael 19 August 2011 в 08:31
поделиться