2012-04-19 6 views
4

アクティビティとフラグメントがリークしており、TextViewsで削除されていないChangeWatchersと思われる原因を追跡しました。TextView un-removed ChangeWatchersによりメモリリークが発生する

シナリオ: アクティビティAがアクティビティBを開始します。BのレイアウトにtextPassword EditTextフィールドがあります。アクティビティBが終了します。

HPROFダンプはそのgcrootパスは以下れる活動B.の1つのインスタンスがまだあることを示していますのTextViewにあなたLinkify.addLinks場合

test.maa.LoginActivity 
'- mContext android.widget.EditText 
    '- this$0 android.widget.TextView$ChangeWatcher 
     '- [1] java.lang.Object[13] 
     '- mSpans android.text.SpannableStringBuilder 
      '- mSource android.text.method.PasswordTransformationMethod$PasswordCharSequence 
       '- mText android.text.MeasuredText 
        '- mMeasured android.text.StaticLayout 
        '- sStaticLayout class android.text.DynamicLayout 

また、これは起こります。

アクティビティBをクリーンアップする方法はありますか?

+1

"アクティビティBが終了しました" - どのように "終了する"のですか?明示的に 'finish()'を呼び出して、 'BACK'ボタンや別のメソッドを押していますか? – Squonk

+0

test.maa.LoginActivityはBですか? HPROFをダンプする前にGCを強制して、まだ収集されていないことを確かめましたか? @MisterSquonkqを参照してください。 – zapl

+0

別のデバイスでさらにテストを行うと、この問題はGSlate 3.1で発生しますが、2.3.4を実行しているThunderboltでは発生しません。 – Daddyboy

答えて

1

私の知る限り、これはAndroidのTextView ChangeWatcher、LinkifyまたはHtml.fromHtmlのスパニング可能な文字列に関連するバグです。この問題を回避するには、自分のアクティビティのonDestroy()でsetText(null)を呼び出します。他の回避策もありますが、漏れに関する追加情報は見つかりませんでした。

+1

私はそれを試しました、私はそれを修正するために何かを見つけるようですそれは数日間です。私の記事もご覧くださいhttp://stackoverflow.com/questions/18348049/android-edittext-memory-leak – MobDev

-1

この特定のView(android:textIsSelectable = "true"コンポーネントを含む)のonCreateView()のActivity Contextの代わりにApplication Contextを使用してみます。

// Singleton 
class MyApplication extends Application { 
    private static MyApplication mApp; 

    @Override 
    public void onCreate() { 
     mApp = this; 
    } 

    public static MyApplication getApp() { 
     return mApp; 
    } 
} 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    // Suggested inflater use Activity Context 
    // So we must tu use Application Context 
    Context context = MyApplication.getApp().getApplicationContext(); 
    LayoutInflater myLayoutInflater = LayoutInflater.from(context); 

    View view = myLayoutInflater.inflate(R.layout.my_view, container, false); 
    return view; 
} 
関連する問題