由于Edittext持有对Activity的context的引用,导致Activity无法正常回收。
解决办法:重写EditText,将对Activity中Context的引用,改为对ApplicationContext的引用。
super(context);
改成:
super(context.getApplicationContext());
备注:存在隐患,会导致点击输入框,无法弹起键盘的问题;慎用!慎用!慎用!
完整示例:
public class TopicEditText extends androidx.appcompat.widget.AppCompatEditText {
public TopicEditText(Context context) {
super(context.getApplicationContext());// 关键点
initView();
}
public TopicEditText(Context context, AttributeSet attrs) {
super(context.getApplicationContext(), attrs);
initView();
}
public TopicEditText(Context context, AttributeSet attrs, int defStyleAttr) {
super(context.getApplicationContext(), attrs, defStyleAttr);
initView();
}
private void initView() {
addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
}
@Override
public void afterTextChanged(Editable editable) {}
});
}
}
文章讨论了EditText因持有Activity的Context引用导致内存泄漏的问题,提出通过改用ApplicationContext来避免这个问题。然而,这种方法可能使输入框无法弹出键盘,因此提醒开发者慎用。提供了一个自定义的TopicEditText类作为示例,该类在构造函数中使用ApplicationContext初始化。
1138

被折叠的 条评论
为什么被折叠?



