gpt4 book ai didi

android - 使用 Spannable Android 的自定义 Textview 中的内存泄漏

转载 作者:行者123 更新时间:2023-11-29 02:25:50 30 4
gpt4 key购买 nike

我有一个自定义 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?)
}
}

但问题是我在 fragment 的布局 (xml) 文件中使用此 TextView 时出现内存泄漏。

这里是leakcanary的截图。

enter image description here

如何消除这种内存泄漏?

最佳答案

从 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);
}

关于android - 使用 Spannable Android 的自定义 Textview 中的内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52272290/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com