Android或者Java開發中記憶體泄漏情況眾多,其中較容易出現且經常被人忽略的記憶體泄漏要數匿名內部類的泄漏了,參考泄漏的代碼如下(摘自Android原生SystemUI模塊):
frameworks/base/packages/SystemUI/src/com/android/systemui/volume/ConfigurableTexts.java
private final ArrayMap<TextView, Integer> mTexts = new ArrayMap<>();
public int add(final TextView text, final int labelResId) {
text.addOnAttachStateChangeListener(new OnAttachStateChangeListener() {
@Override
public void onViewDetachedFromWindow(View v) {
}
@Override
public void onViewAttachedToWindow(View v) {
setTextSizeH(text, sp);
}
});
}
private void setTextSizeH(TextView text, int sp) {
text.setTextSize(TypedValue.COMPLEX_UNIT_SP, sp);
}
其中ArrayMap持有了TextView的參考,而TextView設定了一個onViewAttachedToWindow監聽,在監聽中設定自己屬性的Text Size,此時會造成text參考被長期持有,導致ConfigurableTexts時無法被回收,修改方式如下:
private final ArrayMap<TextView, Integer> mTexts = new ArrayMap<>();
public int add(final TextView text, final int labelResId) {
text.addOnAttachStateChangeListener(mOnAttachStateChangeListener);
}
private OnAttachStateChangeListener mOnAttachStateChangeListener = new OnAttachStateChangeListener() {
@Override
public void onViewDetachedFromWindow(View v) {
}
@Override
public void onViewAttachedToWindow(View v) {
if (v instanceof TextView) {
setTextSizeH((TextView) v, mTexts.get(v));
}
}
};
private void setTextSizeH(TextView text, int sp) {
text.setTextSize(TypedValue.COMPLEX_UNIT_SP, sp);
}
把匿名的內部類物件變成類的成員變數即可,此種情況的記憶體泄漏問題解決,
附上Google Android 原始碼ConfigurableTexts.java鏈接
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/229479.html
標籤:其他
上一篇:NDK&JNI開發總結
