Cursor的close方法源码解析

来源:互联网 发布:淘宝装修全屏海报 编辑:程序博客网 时间:2024/04/29 12:01

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

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

@Override    protected 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;        }    }
0 0
原创粉丝点击