7.5.2 服务端close的分析

服务端close函数的触发是因为客户端通过IBulkCurosr close函数发送了Binder请求。IBulkCurosr的Bn端就是目标CP进程的CursorToBulkCursorAdaptor,其close函数的代码如下:

[—>CursorToBulkCursorAdaptor. java:close]


public void close(){

synchronized(mLock){

disposeLocked();

}

}


[—>CursorToBulkCursorAdaptor. java:disposeLocked]


private void disposeLocked(){

if(mCursor!=null){

//注销ContentObserver,相关知识留到第8章再分析

unregisterObserverProxyLocked();

mCursor.close();//调用SQLiteCursor的close函数

mCursor=null;

}

closeWindowForNonWindowedCursorLocked();

}


SQLiteCurosr的close函数的代码如下:

[—>SQLiteCursor. java:close]


public void close(){

//和客户端一样,先调用AbstractCursor的close,最后会触发AbstractWindowedCursor

//onDeactivateOrClose函数,在那里,服务端的CursorWindow走向终结

super.close();

synchronized(this){

mQuery.close();//调用SQLiteQuery的close,内部将释放sqlite3_stmt实例

//调用SQLiteDirectCursorDriver的cursorClosed函数

mDriver.cursorClosed();

}

}


至此,服务端的close函数就分析完毕。内容较简单,无须详述。

现在来回答本节最开始提出的问题,如果没有显式调用游标对象的close函数,那么该对象被垃圾回收时是否会调用close函数呢?我们将在下一节用代码来回答这个问题。