zoukankan      html  css  js  c++  java
  • 在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的情况了。


  • 相关阅读:
    oracle 索引分区处于不可用状态怎么解决 规格严格
    去IOE 遇到Jdbc mysql sql_mode的坑[转载] 规格严格
    【java】高并发之限流 RateLimiter使用 规格严格
    信息泄露引发的资产失陷与检测分析 规格严格
    一种失陷设备识别与设备失陷度评估的方法、装置 规格严格
    加快ios的出包速度
    为游戏接入ios sdk的oc学习笔记
    缩小ios的包体
    python2排序
    Sentinel 控制台
  • 原文地址:https://www.cnblogs.com/gcczhongduan/p/4238889.html
Copyright © 2011-2022 走看看