В моем приложении отображается AlertDialog с ListView внутри. Все работало отлично, тогда я решил проверить это на утечку памяти. После запуска приложения какое-то время я открыл MAT и создал отчет об утечке подозреваемых. MAT обнаружил несколько подобных утечек:
Один экземпляр "com.android.internal.app.AlertController $RecycleListView" , загруженный "< системный загрузчик → , занимает...
Я потратил много времени на поиск причины этой утечки. Обзор кода не помог мне, и я начал поиски в Интернете. Вот что я нашел:
Проблема 5054: AlertDialog, похоже, вызывает утечку памяти через Message в 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 с элементами. И почему эта проблема еще не исправлена? Спасибо заранее.