В моем приложении отображается 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
с элементами. И почему эта проблема еще не исправлена? Спасибо заранее.