5

我们有活动和片段泄漏,并将原因追溯到 TextViews 上似乎未删除的 ChangeWatchers。

场景:活动 A 启动活动 B。B 在其布局中有一个 textPassword EditText 字段。活动 B 结束。

HPROF 转储显示仍然存在 Activity B 的一个实例。它的 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 

如果您将 Linkify.addLinks 链接到 TextView,也会发生这种情况。

有什么办法可以清理活动 B 吗?

4

3 回答 3

1

据我所知,这似乎是 Android 中与 TextView ChangeWatcher 和 Linkify 或 Html.fromHtml 可跨字符串相关的错误。setText(null)我可以通过调用我的活动的 onDestroy()来解决这个问题。可能还有其他可行的解决方法,但我无法找到有关泄漏的任何进一步信息。

于 2012-08-07T21:41:05.737 回答
0

对我们来说,问题是由PasswordTransformationMethod. EditText特别是对我们来说,它被包裹在 a 中TextInputLayout,所以我们必须像这样切换它(这段代码在 a 中Fragment#onDestroyView()):

        TextInputLayout passwordTextInputLayout = root.findViewById(R.id.textInputLayout);
        if (passwordTextInputLayout.isPasswordVisibilityToggleEnabled())
            passwordTextInputLayout.setPasswordVisibilityToggleEnabled(false);

发生在 androidx.appcompat:appcompat:1.0.0

于 2020-06-18T12:59:13.887 回答
-1

尝试在 onCreateView() 中为这个特定的 View 使用 Application Context 而不是 Activity Context(其中包含任何 android:textIsSelectable="true" 组件)。

// 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 回答