Недавно я узнал, сколько памяти может быть потрачено впустую из-за утечки контекста и как проверить такие утечки с помощью дампа памяти после изменения ориентации экрана.Необходимо создать экземпляр нового действия, а исходное - уничтожить и собрать. Однако, если я не теряю память и не вижу ее, действие, указанное ниже, похоже, не собирается, если оно запускает другое действие и уничтожает себя:
public class Foo extends Activity {
private Button button;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
button = new Button(this);
button.setOnClickListener(new OnClickListener() {
public void onClick(View view) {
startActivity(new Intent(Foo.this, Bar.class));
finish();
}
});
setContentView(button);
}
protected void onDestroy() {
super.onDestroy();
button.setOnClickListener(null);
Log.e("you're it", "isFinishing() == " + isFinishing());
}
}
public class Bar extends Activity {
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
TextView textView = new TextView(this);
textView.setText("hello, world");
setContentView(textView);
}
}
Вот информация о дампе памяти, полученная после нажатия кнопка для запуска Bar и запроса на сборку мусора несколько раз:
Class Name | Shallow Heap | Retained Heap
----------------------------------------------------------------------------------------
com.test.testProject.Foo @ 0x4135b188 | 184 | 2,208
mOuterContext android.app.ContextImpl @ 0x4135b390 | 96 | 392
java.lang.Thread @ 0x40996460 main Thread| 80 | 1,416
mContext android.media.AudioManager @ 0x4135b480 | 48 | 176
----------------------------------------------------------------------------------------
Основываясь на this , я подумал, что добавление дополнительного финиша между действиями сделает первое подходящим для сбора и позволит мне проверить на наличие утечек дополнительный способ, разумно ли это? У меня утечка памяти? Есть ли какая-то причина, по которой Android хочет сохранить эту уничтоженную активность?