Android中TextView设置部分文字点击时需要用到ClickableSpan,但是ClickableSpan会引起内存泄漏(通过LeakCanary可以检测到),网上找了好久没看到有效地解决方案,经过尝试,解决方案如下:
在页面销毁时(比如:Activity的onDestroy、Fragment的onDestroyView、View的onDetachedFromWindow),把TextView的Spannable清空就可以了,比如我在自定义View中这样处理的,其它地方同理:
override fun onDetachedFromWindow() {
val c = tv.text
if(c is Spannable) {
c.clearSpans()
}
tv.text = ""
super.onDetachedFromWindow()
}
补充:上面示例中的代码是kotlin,使用了扩展函数,如果是java,可以这样写
CharSequence text = tv.getText();
if (text instanceof Spannable) {
Spannable spannable = (Spannable) text;
// 如果项目引入了core-ktx,依然可以使用Kotlin的扩展函数简写如下
SpannableStringKt.clearSpans(spannable);
// 如果没有引入core-ktx,可以这样写
//Object[] spans = spannable.getSpans(0, text.length(), Object.class);
//for (Object span: spans) {
//spannable.removeSpan(span);
//}
}
【android|解决Android中使用ClickableSpan导致的内存泄漏】
推荐阅读
- Android|Kotlin 协程(二) -协程取消与超时
- 个人总结|个人总结笔记
- java|语言基础1
- java|day01
- CGB2202|CGB2202二进制
- autojs数据驱动界面和界面驱动数据
- java基础|Java方法的形参实参与值传递引用传递
- java|java 中顺序 形参和实参,Java中参数传递机制-形参和实参说明
- Java|Java方法的形参和实参