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函数呢?我们将在下一节用代码来回答这个问题。