• android中使用Cursor时防止内存泄露的几个方面


    最近在工作中处理了一些内存泄露的问题,在这个过程中我尤其发现了一些基本的问题反而忽略导致内存泄露,比如静态变量,cursor关闭,线程,定时器,反注册,bitmap等等,我稍微统计并总结了一下,当然了,这些问题这么说起来比较笼统,接下来我会根据问题,把一些实例代码贴出来,一步一步分析,在具体的场景下,用行之有效的方法,找出泄露的根本原因,并给出解决方案。
       现在,就从cursor关闭的问题开始把,谁都知道cursor要关闭,但是往往相反,人们却常常忘记关闭,因为真正的应用场景可能并非理想化的简单。
    1. 理想化的cursor关闭

    1

    2

    3

    4

    de >// Sample Codede>

    de >Cursor cursor = db.query();de>

    de >List<String> list = convertToList(cursor);de>

    de >cursor.close();de>

       这是最简单的cursor使用场景,如果这里的cursor没有关闭,我想可能会引起万千口水,一片骂声。
       但是实际场景可能并非如此,这里的cursor可能不会关闭,至少有以下两种可能。

    2. Cursor未关闭的可能
        (1). cursor.close()之前发生异常。
        (2). cursor需要继续使用,不能马上关闭,后面忘记关闭了。

    3. Cursor.close()之前发生异常
        这个很容易理解,应该也是初学者最开始碰到的常见问题,举例如下:

    1

    2

    3

    4

    5

    6

    7

    8

    9

    de >tryde> de >{ de>

    de >    de>de >Cursor c = queryCursor(); de>

    de >    de>de >int a = c.getInt(1); de>

    de >    de>de >......de>

    de >    de>de >// 如果出错,后面的cursor.close()将不会执行de>

    de >    de>de >......de>

    de >    de>de >c.close(); de>

    de >} de>de >catchde> de >(Exception e) { de>

    de >}de>

      正确写法应该是:

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    de >Cursor c;de>

    de >tryde> de >{ de>

    de >    de>de >c = queryCursor(); de>

    de >    de>de >int a = c.getInt(1); de>

    de >    de>de >......de>

    de >    de>de >// 如果出错,后面的cursor.close()将不会执行de>

    de >    de>de >//c.close(); de>

    de >} de>de >catchde> de >(Exception e) { de>

    de >} finally{de>

    de >    de>de >ifde> de >(c != de>de >nullde>de >) {de>

    .relpost{clear:both}

    Tag:

    Freenovo 发表于2014-05-07 21:40:00 | 编辑 | 分享 0

    引用地址:

  • 相关阅读:
    GPG实践
    keepass数据库保存密码
    基于xammp搭建自己的网页
    《信息安全专业导论》第12周学习总结
    《信息安全专业导论》第11周学习总结
    基于python中tkinter的计算机实现
    《信息安全专业导论》第10周学习总结
    俄罗斯方块
    小学四则运算编程实践
    链表
  • 原文地址:https://www.cnblogs.com/freenovo/p/4469780.html
Copyright © 2020-2023  润新知