Вы пробовали это? Как вы можете видеть, этот диалог управляется действием и автоматически закрывается, когда действие уничтожается.
риложение показывает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
с предметами. И почему эта проблема еще не исправлена? Заранее спасибо.