当前位置: 首页 > news >正文

在Activity中为什么要用managedQuery()

      刚開始接触android的时候,每次用数据库都会犹豫使用哪种方式,一种是getContentResolver().query(...),还有一种是managedQuery(...),后来习惯了使用前一种,后一种就被我遗忘了,可是在实际做项目时,有时数据库常常会报cursor not close的warning,有的cursor你能够手动关闭,可是有一些就不能够了,比方当前是个listActivity,他的adapter是个cursorAdapter,这里的cursor就不能关掉,当然你能够在onDestroy中做关闭的操作,可是我比較习惯把cursor定义为局部变量,不是全局可见的,这种话你就不能在onDestroy中关闭了。

     后来就查看源代码,发现manageQuery能够为你维护这个cursor。在你退出activity时为你自己主动关闭,事实上他的原理也非常easy,看源代码:


Activity.java


private static final class ManagedCursor {
        ManagedCursor(Cursor cursor) {
            mCursor = cursor;
            mReleased = false;
            mUpdated = false;
        }


        private final Cursor mCursor;
        private boolean mReleased;
        private boolean mUpdated;
    }
    private final ArrayList<ManagedCursor> mManagedCursors =
        new ArrayList<ManagedCursor>();

这里定义了一个Cursor队列,这个Cursor是被封装的。

以下是对这个队列的操作:

 public final Cursor managedQuery(Uri uri,
                                     String[] projection,
                                     String selection,
                                     String[] selectionArgs,
                                     String sortOrder)
    {
        Cursor c = getContentResolver().query(uri, projection, selection, selectionArgs, sortOrder);
        if (c != null) {
            
startManagingCursor(c);
        }
        return c;
    }

//加入,注意要加锁

 public void startManagingCursor(Cursor c) {
        synchronized (mManagedCursors) {
            mManagedCursors.add(new ManagedCursor(c));
        }
    }

//在这个activity结束的时候,会调用onDestroy,所以清理的工作应该在那里

protected void onDestroy() {
       //省略。。。。


        // close any cursors we are managing.
      
 synchronized (mManagedCursors) {
            int numCursors = mManagedCursors.size();
            for (int i = 0; i < numCursors; i++) {
                ManagedCursor c = mManagedCursors.get(i);
                if (c != null) {
                    c.mCursor.close();
                }
            }
            mManagedCursors.clear();
        }


   //省略。。。。

    }



近期又看源代码,发现能够不用managedQuery,能够用普通的query,然后执行 startManagingCursor(cursor),相同能够把cursor交给系统去管理,不用操心cursor没有close的情况了。


转载于:https://www.cnblogs.com/mengfanrong/p/3929462.html

相关文章:

  • uoj#352. 新年的五维几何(概率期望+爆搜)
  • 自己编写的一个Javascript正则表达式对象
  • 几张关于IT业人才成长的统计图片
  • POJ 2029
  • sed命令教程
  • jquery版本
  • 【M19】了解临时对象的来源
  • NSTimer的详细用法
  • Windows下安装Scrapy方法及常见安装问题总结——Scrapy安装教程
  • c# Winform上传文件
  • Codeforces Round #532 (Div. 2)
  • Ubuntu 图形处理软件
  • 【每日笔记】【Go学习笔记】2019-01-10 codis proxy处理流程
  • 创建Windows服务简单流程
  • Airflow成为Apache软件基金会的顶级项目
  • ABAP的include关键字,Java的import, C的include和C4C ABSL 的import比较
  • Android单元测试 - 几个重要问题
  • Angular 4.x 动态创建组件
  • ComponentOne 2017 V2版本正式发布
  • CSS中外联样式表代表的含义
  • ES2017异步函数现已正式可用
  • Java 23种设计模式 之单例模式 7种实现方式
  • Java 最常见的 200+ 面试题:面试必备
  • java多线程
  • 从0实现一个tiny react(三)生命周期
  • 基于组件的设计工作流与界面抽象
  • 容器化应用: 在阿里云搭建多节点 Openshift 集群
  • 通过几道题目学习二叉搜索树
  • 微信小程序上拉加载:onReachBottom详解+设置触发距离
  • 掌握面试——弹出框的实现(一道题中包含布局/js设计模式)
  • 如何在招聘中考核.NET架构师
  • 资深实践篇 | 基于Kubernetes 1.61的Kubernetes Scheduler 调度详解 ...
  • ​DB-Engines 12月数据库排名: PostgreSQL有望获得「2020年度数据库」荣誉?
  • # C++之functional库用法整理
  • (html5)在移动端input输入搜索项后 输入法下面为什么不想百度那样出现前往? 而我的出现的是换行...
  • (python)数据结构---字典
  • (附源码)springboot炼糖厂地磅全自动控制系统 毕业设计 341357
  • (附源码)基于SpringBoot和Vue的厨到家服务平台的设计与实现 毕业设计 063133
  • (九十四)函数和二维数组
  • (六)c52学习之旅-独立按键
  • (未解决)jmeter报错之“请在微信客户端打开链接”
  • (一)eclipse Dynamic web project 工程目录以及文件路径问题
  • (原創) 如何安裝Linux版本的Quartus II? (SOC) (Quartus II) (Linux) (RedHat) (VirtualBox)
  • (原創) 物件導向與老子思想 (OO)
  • (转)chrome浏览器收藏夹(书签)的导出与导入
  • (轉貼) 寄發紅帖基本原則(教育部禮儀司頒布) (雜項)
  • .NET Core 版本不支持的问题
  • .NET Core、DNX、DNU、DNVM、MVC6学习资料
  • .NET Core/Framework 创建委托以大幅度提高反射调用的性能
  • .NET Core中Emit的使用
  • .NET DataGridView数据绑定说明
  • .Net Memory Profiler的使用举例
  • .NET轻量级ORM组件Dapper葵花宝典
  • @ModelAttribute 注解
  • [ Linux Audio 篇 ] 音频开发入门基础知识