22

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);
    }
}
4

6 に答える 6

9

これは既知のバグであり、ICSMR1で修正される予定です。

于 2011-12-14T01:29:12.610 に答える
5

この問題の影響を受けていることを確認するのに数時間費やしました。

この問題は、スペル チェッカーが原因のようです。EditText ビューの提案を無効にすると、すべてが適切にガベージ コレクションされます。

mInputType = mText.getInputType();
mText.setInputType(mInputType | InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS);

多くのユーザーがスペルチェックを望んでいるので、これを無効にしたくありません。そのため、入力フィールドがフォーカスを受け取ったときに一時的に有効にする方法があるかもしれません。

スペル チェッカーが必要ない場合は、代わりにこれをレイアウト xml の EditText 要素に追加します。

android:inputType="textNoSuggestions"

それも直りそうです。

編集:

関連していると思われるこのスレッドを見つけました: SpellCheckerSession リークを回避しますか?

于 2013-03-03T20:30:29.603 に答える
-2

メモリ リークに関する Android リソース セクションで説明されている状況に陥っています。いくつかの解決策については、そのページも参照してください。

于 2011-12-14T00:14:01.400 に答える
-2

同じ問題が発生しました。ダイアログの EditText ondismiss を非表示にして解決しました。

  mEditText.setVisibility(View.GONE);
于 2013-08-03T00:17:30.700 に答える