Cursor的close方法源码解析
Cursor的close方法源码解析
Kobe_Gong_5 发表于3年前
Cursor的close方法源码解析
  • 发表于 3年前
  • 阅读 9
  • 收藏 0
  • 点赞 0
  • 评论 0

Cursor.close会关闭与其关联的Database。

以DownloadManager中的CursorTranslator为例。
CursorTranslator继承CursorWrapper
CursorTranslator中包裹的cursor是ContentResolver的内部类CursorWrapperInner.
CursorWrapperInner中包裹了BulkCursorToCursorAdapter
BulkCursorToCursorAdaptor将服务端返回的IBulkCursor适配成本地进程可以使用的Cursor类型。
BulkCursorToCursorAdaptor继承于AbstractWindowedCursor。
AbstractWindowedCursor有一个成员变量是mWindow(CursorWindow类型)
AbstractWindowedCursor继承与AbstractCursor,并且覆盖了onDeactivateOrClose方法。

@Overrideprotected void onDeactivateOrClose() {super.onDeactivateOrClose();
        closeWindow();
    }

closeWindow方法的实现是:

 protected void closeWindow() {if (mWindow != null) {
            mWindow.close();
            mWindow = null;
        }
    }

onDeactivateOrClose方法是在AbstractCursor的close方法中调用的。具体方法如下:

public void close() {
        mClosed = true;
        mContentObservable.unregisterAll();
        onDeactivateOrClose();
    }

CursorWindow继承于SQLiteClosable,在SQLiteClosable的close方法释放当前连接。

public void close() {
        releaseReference();
    }public void releaseReference() {boolean refCountIsZero = false;synchronized(this) {
            refCountIsZero = --mReferenceCount == 0;
        }if (refCountIsZero) {
            onAllReferencesReleased();
        }
    }

CursorWindow覆盖了onAllReferencesReleased方法。

protected void onAllReferencesReleased() {
        dispose();
    }private void dispose() {if (mCloseGuard != null) {
            mCloseGuard.close();
        }if (mWindowPtr != 0) {
            recordClosingOfWindow(mWindowPtr);
            nativeDispose(mWindowPtr);
            mWindowPtr = 0;
        }
    }

共有 人打赏支持
粉丝 3
博文 55
码字总数 43587
×
Kobe_Gong_5
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: