Мое приложение показывает 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
с элементами. И почему до сих пор не решена эта проблема? Заранее спасибо.