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

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

Один экземпляр"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с предметами. И почему эта проблема еще не исправлена? Заранее спасибо.

Ответы на вопрос(4)

Ваш ответ на вопрос