Ice Cream Sandwich では、EditText を含むアクティビティがある場合、ユーザーがアクティビティを離れた後でも、EditText はアクティビティのコンテキストを保持します。これを実証するために、大きなバイト配列を割り当てる TestLeakActivity を作成しました。アクティビティのコンテキストはガベージ コレクションされないため、バイト配列がヒープに蓄積され、最終的に OutOfMemoryError が発生します。DDMS ヒープ ツールを使用してヒープの増加を観察できます。また、Eclipse MAT の HPROF ファイルを調べることで、EditText クラスへの未解決の参照を追跡できます。メモリ リークを作成するには、LaunchActivity に移動し、TestLeakActivity の起動とバックアウトを続けます。
LaunchActivity.java
パッケージcom.example.testleakproject; android.app.Activity をインポートします。 android.content.Intent をインポートします。 android.os.Bundle をインポートします。 android.view.View をインポートします。 android.view.View.OnClickListener をインポートします。 android.view.ViewGroup をインポートします。 android.widget.Button をインポートします。 android.widget.TextView をインポートします。 public class LaunchActivity は Activity { @オーバーライド public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); ボタン ボタン = 新しいボタン(これ); button.setText("TestLeakActivity を開始"); button.setOnClickListener(new OnClickListener() { @オーバーライド public void onClick(View v) { インテント インテント = 新しいインテント(LaunchActivity.this, TestLeakActivity.class); startActivity(意図); } }); ViewGroup コンテナ = ((ViewGroup) findViewById(android.R.id.content)); container.addView(ボタン); } }
TestLeakActivity.java
パッケージcom.example.testleakproject; android.app.Activity をインポートします。 android.os.Bundle をインポートします。 android.view.ViewGroup をインポートします。 android.widget.EditText をインポートします。 public class TestLeakActivity extends Activity { プライベート バイト[] mSomeBytes = 新しいバイト[1048576]; @オーバーライド public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); EditText editText = new EditText(this); editText.setHint("TestLeakActivity"); ViewGroup コンテナ = ((ViewGroup) findViewById(android.R.id.content)); container.addView(editText); } }