`
enuoCM
  • 浏览: 21446 次
  • 性别: Icon_minigender_1
  • 来自: 成都
文章分类
社区版块
存档分类
最新评论

内存泄漏之TextLine.recycle

阅读更多
Issue: https://code.google.com/p/android/issues/detail?id=59310

android.text.TextLine has memory leak on mSpanned and SpanSet.

使用下面的工具类移除泄漏:
public class TextLineRecycler {
    private static Field sCached;
    private static Field sCharacterStyleSpanSet;
    private static Field sMetricAffectingSpanSpanSet;
    private static Field sReplacementSpanSpanSet;
    private static Field sSpans;
    private static Field sSpanned;
    private static Field sText;

    static {
        try {
            Class clazz = Class.forName("android.text.TextLine");
            sCached = clazz.getDeclaredField("sCached");
            sSpanned = clazz.getDeclaredField("mSpanned");
            sText = clazz.getDeclaredField("mText");
            sCached.setAccessible(true);
            sSpanned.setAccessible(true);
            sText.setAccessible(true);
            if (Build.VERSION.SDK_INT > Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
                sCharacterStyleSpanSet = clazz.getDeclaredField("mCharacterStyleSpanSet");
                sMetricAffectingSpanSpanSet = clazz.getDeclaredField("mMetricAffectingSpanSpanSet");
                sReplacementSpanSpanSet = clazz.getDeclaredField("mReplacementSpanSpanSet");
                Class spanSetClass = Class.forName("android.text.SpanSet");
                sSpans = spanSetClass.getDeclaredField("spans");
                sCharacterStyleSpanSet.setAccessible(true);
                sMetricAffectingSpanSpanSet.setAccessible(true);
                sReplacementSpanSpanSet.setAccessible(true);
                sSpans.setAccessible(true);
            }
        } catch (Exception e) {
            Log.e("TextLineRecycler", "", e);
        }
    }

    /**
     * recycle system TextLine
     */
    public static void recycle() {
        try {
            Object cached = sCached.get(null);
            int length = Array.getLength(cached);
            if (cached != null) {
                synchronized (cached) {
                    for (int i = 0; i < length; i++) {
                        Object textLine = Array.get(cached, i);
                        if (textLine != null) {
                            Object text = sText.get(textLine);
                            // mText has been recycled, recycle mSpanned and other SpanSet here
                            if (null == text && null != sSpanned.get(textLine)) {
                                sSpanned.set(textLine, null);
                                if (Build.VERSION.SDK_INT > Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
                                    recycleSpan(sCharacterStyleSpanSet, textLine);
                                    recycleSpan(sMetricAffectingSpanSpanSet, textLine);
                                    recycleSpan(sReplacementSpanSpanSet, textLine);
                                }
                            }
                        }
                    }
                }
            }
        } catch (Exception e) {
            Log.e("TextLineRecycler", "", e);
        }
    }

    private static <T extends CharacterStyle> void recycleSpan(Field field, Object textLine)
            throws IllegalArgumentException, IllegalAccessException {
        Object spanSet = field.get(textLine);
        T[] spans = (T[]) TextLineRecycler.sSpans.get(spanSet);
        if (spans != null) {
            for (int i = 0; i < spans.length; i++) {
                spans[i] = null;
            }
        }
    }
}
分享到:
评论

相关推荐

    Android处理内存泄漏的代码例子

    在Android开发中,内存泄漏是一个严重的问题,它会导致应用程序占用过多内存,影响性能甚至导致应用崩溃。本示例代码着重展示了如何避免Android应用中的内存泄漏,主要包括五个关键方面:关闭游标、重用适配器、回收...

    com.lowagie.text

    bitmap.recycle(); } Image img = Image.getInstance(imageBytes); document.add(img); ``` 5. **关闭Document**:所有内容添加完成后,记得关闭Document。 ```java document.close(); ``` 以上就是使用...

    android大位图二次采样处理三

    1. 监控内存:使用Android Profiler工具监控应用的内存使用情况,及时发现并解决内存泄漏问题。 2. 使用Bitmap.recycle():当位图不再使用时,调用recycle()释放其占用的内存,但要注意回收后不能再使用该位图。 3. ...

    Android 双缓存机制下 Bitmap Recycle方案

    双缓存机制下,Android应用会对大内存的图片做二级缓存,对于溢出缓存的bitmap实行recycle,但是有些bitmap正在显示,会造成概率性的花屏等, 该方案提供了一套完整的防止recycle正在显示的bitmap的方案

    android解决内存溢出的问题..docx

    在使用完毕后,调用 recycle() 方法释放图片占用的内存空间。 3. 对复杂的 ListView 进行合理设计与编码 在设计 ListView 时,需要注意重用 Adapter 里面的 convertView 以及 holder 机制的运用。可以使用 ...

    Android 内存泄漏调试经验分享

    Android提供了多种工具来帮助开发者检测和定位内存泄漏问题,其中最常用的工具之一是DDMS(Dalvik Debug Monitor Service)。DDMS可以用来查看正在运行的应用程序的内存使用情况,并提供了一些基本的堆分析功能。 *...

    bitmap内存问题

    `Bitmap`作为占用内存较大的数据类型之一,往往是导致内存溢出的主要原因之一。 1. **图片加载方式**:如果直接将大尺寸的图片加载到内存中,而没有进行适当的压缩处理,很容易超出内存限制。 2. **重复创建Bitmap...

    Android开发最常见的5大内存泄漏.docx

    在Android开发中,内存泄漏是开发者需要密切关注的问题,因为它直接影响到应用的性能和稳定性。内存泄漏发生时,不再使用的对象由于被其他活跃对象引用而无法被垃圾回收器正常清理,导致内存占用持续增加,最终可能...

    内存泄露从入门到精通三部曲之常见原因与用户实践1

    内存泄露是程序运行过程中的一个严重问题,尤其是在资源有限的移动设备上,如Android系统。内存泄露会导致应用程序性能下降,严重时甚至导致应用崩溃。本文将深入探讨内存泄露的常见原因,以及如何避免这些问题。 ...

    android开发如何做好内存优化.pdf

    在不再使用Bitmap时,应调用`recycle()`方法释放内存。不过,从Android 4.4(KitKat)开始,系统会自动管理Bitmap的内存,但为了兼容性和最佳实践,仍然建议在适当时候回收Bitmap。 4. **无效内存管理**:频繁申请...

    Android开发最常见的5大内存泄漏

    在Android应用开发中,内存泄漏是一个非常重要的问题,它会导致应用程序占用过多的内存,从而影响性能,甚至引发应用崩溃。本文将深入探讨Android开发中最常见的五种内存泄漏情况,并提供相应的解决方案。 一、静态...

    Android应用源码之防止内存溢出浅析.zip

    本资源"Android应用源码之防止内存溢出浅析"旨在深入探讨如何通过源码分析来避免这种问题。 一、Android内存管理基础 Android系统采用Dalvik虚拟机(在Android 5.0之后改为ART)执行应用代码,其内存管理基于垃圾...

    Android性能优化(七)Bitmap内存压缩示例源码BitMapCache.zip

    在Android开发中,Bitmap对象是图像处理的核心,但由于其消耗大量内存,不当使用往往会导致应用性能下降甚至引发内存溢出(Out Of Memory)问题。因此,Bitmap的内存管理与优化至关重要,尤其是对于图像密集型应用而...

    Oracle内存调优及优化思路.pptx

    Oracle数据库的内存调优是数据库性能优化的关键环节。Oracle内存主要分为两个主要区域:系统全局区(SGA)和程序全局区(PGA)。SGA在实例启动时分配,是Oracle实例的基础组件,而PGA则在服务器进程启动时分配。 ...

    Android有效解决加载大图片时内存溢出的问题

    Android 中加载大图片时内存溢出的...可以使用 BitmapFactory.Options、recycle() 方法、Java 中的内存优化技术、Android 中的内存优化技术、JNI 技术、避免使用大图片和缓存技术来减少内存的消耗,从而避免内存溢出。

    android内存的溢出和泄漏问题

    4. Bitmap对象未正确回收:Bitmap占用较大的内存,使用完毕后应调用recycle()方法,将其释放。 为了优化ListView,开发者可以采用以下策略: - 使用convertView:在getView()方法中,检查传入的convertView是否为...

    安卓开发-防止内存溢出浅析.zip

    综上所述,防止安卓应用内存溢出需要全面考虑内存管理策略,包括避免内存泄漏、控制大对象分配、优化Bitmap使用、监控内存状态以及合理设计程序结构。只有深入理解这些知识点,才能编写出高效、稳定的安卓应用。

    recycle.bin是什么-.docx

    如果你发现某个盘下的$RECYCLE.BIN 文件夹占用了很大的内存空间(说明该文件夹回收的东西多了),你可以右键单击桌面上的回收站-属性-把"删除时不将文件移入回收站,而是彻底删除"那个选上,然后就可以进入任何盘把$...

Global site tag (gtag.js) - Google Analytics