android - 使用 Spannable Android 的自定义 Textview 中的内存泄漏
问题描述
我有一个自定义文本视图,其中有五个城市名称和每个城市名称的可扩展点击侦听器。代码如下
/**
* Created by @raj on 26/04/18.
*/
class TopCitiesTextView : TextView {
private var mListener: OnCityClickListener? = null
constructor(ctx: Context?) : super(ctx) {
initView(ctx, null, 0)
}
constructor(ctx: Context?, attrs: AttributeSet?) : super(ctx, attrs) {
initView(ctx, attrs, 0)
}
constructor(ctx: Context?, attrs: AttributeSet?, defStyle: Int) : super(ctx, attrs, defStyle) {
initView(ctx, attrs, defStyle)
}
private fun initView(ctx: Context?, attrs: AttributeSet?, defStyle: Int) {
}
override fun onFinishInflate() {
super.onFinishInflate()
val cityArray: Array<out String> = context.resources.getStringArray(R.array.top_cities_view_text)
val spannableString: SpannableString = SpannableString(cityArray[0])
this.text = spannableString
this.append(" ")
for (i in 1 until cityArray.size) {
val citySpannableString = SpannableString(cityArray[i])
citySpannableString.setSpan(object : ClickableSpan() {
override fun onClick(widget: View?) {
mListener?.onCityClicked(cityArray[i])
}
override fun updateDrawState(ds: TextPaint) {
super.updateDrawState(ds)
ds.isUnderlineText = false
}
}, 0, citySpannableString.length, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)
this.append(citySpannableString)
if (i != cityArray.size-1)
this.append(", ")
}
movementMethod = LinkMovementMethod.getInstance()
}
fun setCityClickListener(listener: OnCityClickListener) {
this.mListener = listener
}
interface OnCityClickListener {
fun onCityClicked(city: String?)
}
}
但问题是我在片段的布局(xml)文件中使用此文本视图时出现内存泄漏。
这是leakcanary的截图。
如何消除此内存泄漏?
解决方案
从 Activity 的 onDestroy 文本中删除 ClickableSpan 以避免泄漏。
if (textView.getText() instanceof SpannableString) {
SpannableString spannableStr = (SpannableString) textView.getText();
ClickableSpan[] spans = spannableStr.getSpans(0, spannableStr.length(), ClickableSpan.class);
for (ClickableSpan span : spans) {
spannableStr.removeSpan(span);
}
textView.setText(spannableStr);
}
推荐阅读
- java - 来自 Slider On fxml 的标签
- php - 使用 htaccess 文件进行 URL 重定向,对 url 友好重定向的 url 友好
- excel - 填充 ListBox 时宏卡在 For Each 循环中
- jquery - 使用包含相对路径的图像的 CORS 加载外部 AJAX
- java - raf.seek(pos) 的类比
- regex - 仅使用正则表达式从主页重定向并保留 UTM 参数
- excel - 从 Excel 粘贴到 Word 的 VBA 代码在某些 PC 上运行,在其他 PC 上返回错误 4198
- xamarin.forms - Xamarin 表单中的自定义标签渲染器:OnDraw 从未触发
- c# - 如何在“where”中使用实体框架中的数组值
- javascript - 实例化通过 jQuery.getScript 加载的类时遇到 ReferenceError