В Ice Cream Sandwich, когда есть Activity, содержащий EditText, EditText сохранит контекст активности даже после того, как пользователь покинет Activity. Чтобы продемонстрировать это, я создал TestLeakActivity, который выделяет большой массив байтов. Поскольку контекст активности никогда не собирает мусор, массивы байтов накапливаются в куче, в результате вызывая OutOfMemoryError. Вы можете наблюдать рост кучи, используя инструмент кучи DDMS, и вы можете отслеживать выдающиеся ссылки на класс EditText, просматривая файл HPROF в Eclipse MAT. Чтобы создать утечку памяти, перейдите в LaunchActivity и просто продолжайте запуск и поддержку TestLeakActivity.
LaunchActivity.java
package com.example.testleakproject;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.TextView;
public class LaunchActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Button button = new Button(this);
button.setText("Start TestLeakActivity");
button.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(LaunchActivity.this, TestLeakActivity.class);
startActivity(intent);
}
});
ViewGroup container = ((ViewGroup) findViewById(android.R.id.content));
container.addView(button);
}
}
TestLeakActivity.java
package com.example.testleakproject;
import android.app.Activity;
import android.os.Bundle;
import android.view.ViewGroup;
import android.widget.EditText;
public class TestLeakActivity extends Activity {
private byte[] mSomeBytes = new byte[1048576];
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
EditText editText = new EditText(this);
editText.setHint("TestLeakActivity");
ViewGroup container = ((ViewGroup) findViewById(android.R.id.content));
container.addView(editText);
}
}