Android Cursor源码笔记(2)

  1. CrossProcessCursor**extends Cursor,按照注释所说,这是Cursor的一个扩展,支持Cursor被远端进程所使用(某种意义上,跨进程Cursor才是被用的最多的,因此这里也成了一个base的接口),一个跨进程的Cursor可以通过fill(fillWindow) 一个 CursorWindow(**A buffer containing multiple cursor rows)的方式编排到远端进程,一个优化是该Cursor本身可以提供一个pre-filled的window(getWindow),从而避免了一次数据拷贝.

  2. getWindow():返回一个已经将Cursor执行的row的data填充完毕的CursorWindow.window中所含有的row就是Cursor的getPosition()所标识的row(就是Cursor当前所指向的row),Window中的data会和Cursor当前所指保持同步(Cursor move, window也会move)

  3. fillWindow(int position, CursorWindow window),从position开始(包含position),直到最后或者Window的空间耗尽,所有的row的data填充到Window.

  4. onMove(int oldPosition, int newPosition),每次Cursor成功的Move到新的位置都会被回调, onMove返回false会导致Move也返回false,并且Cursor的位置会变为beforeFirst(-1),一般来说,这个函数应该只在Cursor自己的Move类函数中调用,不能在外部调用.

  5. AbstractCursor implements CrossProcessCursor, 所有具体Cursor类的基类,封装了一部分默认 常规操作。

    • 扩展了ContentObserver -> SelfContentObserver,内部维护一个AbstractCursor的weakRef(构造时会指定Cursor),onChange(boolean selfChange)回调函数会尝试继续传递change给Cursor的onChange函数,而该Observer则是在setNotificationUri(ContentResolver cr, Uri notifyUri, int userHandle)时就会自己new一个并注册(mContentResolver.registerContentObserver(mNotifyUri, true, mSelfObserver, userHandle)).
    • setNotificationUri(ContentResolver cr, Uri notifyUri, int userHandle)函数会被多线程调用,因此内部会加锁,并且每次只能register一个SelfContentObserver(旧的会被刷掉),相应的getNotificationUri()内部也会加锁.
    • setExtras(Bundle extras)/getExtras(),内部有一个专门的mExtras对应。
    • checkPosition(),如果是无效位置(哨兵位)的话会抛异常.
    • finalize(),最后一次力所能及的释放资源:注销observer,以及close(没有close的话),之所以是力所能及,是因为JVM并不保证一定调用(常识).
    • onChange(boolean selfChange),因为涉及到了mSelfObserver的操作,会加锁,SelfContentObserver触发的onChange的selfChange为false.mContentObservable会保存当前所有的ContentObserver,在这一步也会通过自己的dispatchChange(selfChange, null)将change通知到注册到自己的Observer(mContentObservable说白了就是把Listener机制封装到了一个单独的类中,没什么神秘的,mDataSetObservable同样如此),如果是selfChange而且mNotifyUri不是null,那么会调用mContentResolver.notifyChange(mNotifyUri, mSelfObserver).
    • getColumnIndex(String columnName),简单的遍历ColumnName数组进行不区分大小写匹配.
    • final moveToPosition(int position),内部维护了一个mPos来表示Cursor当前指向的位置,构造时初始化为-1,注意该函数是final的,在mPos就是当前要移动的pos时,直接return true,接着是一个onMove函数的回调(这为subclass提供了自己的定制回调),如果onMove返回的是false,那么mPos也直接置为-1,返回的也是false,这就解释了前面onMove函数注释的意义(对MoveXXX操作有决定权),如果onMosve是true,那么mPos设置为position,代表着Move的成功,函数也返回true.其他的moveXXX()函数其实就是该函数的简单包装.
    • isFirst()/isLast()/isBeforeFirst()/isAfterLast(),mPos和getCount()的简单逻辑比较,注意的是在count为0时, isBeforeFirst() == isAfterLast() == true.
    • fillWindow(int position, CursorWindow window)是s对DatabaseUtils.cursorFillWindow()的直接转发.
    • 一个mClosed Flag,在这个抽象基类中(AbstractCursor), close()的操作只是设置Flag,清空Observable,触发Deactivate/Close的callback.没有实质性的操作,这也是抽象类所必须的,close的具体行为应该由subClass自己决定。
    • requery()/onDeactivateOrClose()会触发mDataSetObservable的notifyChanged()/notifyInvalidated(),还会注册/注销SelfObserver.一个是开始前的初始化,一个是结束时的清理.

没有更多推荐了,返回首页