Cursor.close会关闭与其关联的Database。
以DownloadManager中的CursorTranslator为例。
CursorTranslator继承CursorWrapper
CursorTranslator中包裹的cursor是ContentResolver的内部类CursorWrapperInner.
CursorWrapperInner中包裹了BulkCursorToCursorAdapter
BulkCursorToCursorAdaptor将服务端返回的IBulkCursor适配成本地进程可以使用的Cursor类型。
BulkCursorToCursorAdaptor继承于AbstractWindowedCursor。
AbstractWindowedCursor有一个成员变量是mWindow(CursorWindow类型)
AbstractWindowedCursor继承与AbstractCursor,并且覆盖了onDeactivateOrClose方法。
1 | @Override protected void onDeactivateOrClose() { super.onDeactivateOrClose(); closeWindow(); } |
closeWindow方法的实现是:
1 | protected void closeWindow() { if (mWindow != null) { mWindow.close(); mWindow = null; } } |
onDeactivateOrClose方法是在AbstractCursor的close方法中调用的。具体方法如下:
1 | public void close() { mClosed = true; mContentObservable.unregisterAll(); onDeactivateOrClose(); } |
CursorWindow继承于SQLiteClosable,在SQLiteClosable的close方法释放当前连接。
1 | public void close() { releaseReference(); } public void releaseReference() { boolean refCountIsZero = false; synchronized(this) { refCountIsZero = --mReferenceCount == 0; } if (refCountIsZero) { onAllReferencesReleased(); } } |
CursorWindow覆盖了onAllReferencesReleased方法。
1 | protected void onAllReferencesReleased() { dispose(); } private void dispose() { if (mCloseGuard != null) { mCloseGuard.close(); } if (mWindowPtr != 0) { recordClosingOfWindow(mWindowPtr); nativeDispose(mWindowPtr); mWindowPtr = 0; } } |