5

アクティビティとフラグメントのリークがあり、その原因は、TextView の削除されていない ChangeWatcher にあると思われるものにまでさかのぼります。

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

HPROF ダンプは、アクティビティ B のインスタンスがまだ 1 つあることを示しています。その gcroot パスは次のとおりです。

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 

これは、TextView に Linkify.addLinks を追加した場合にも発生します。

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

4

3 に答える 3

-1

この特定のビュー (android:textIsSelectable="true" コンポーネントを含む) の onCreateView() でアクティビティ コンテキストの代わりにアプリケーション コンテキストを使用してみてください。

// 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;
}
于 2013-10-17T13:45:36.713 に答える