🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
服务端close函数的触发是因为客户端通过IBulkCurosrclose函数发送了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的cursorClose函数 mDriver.cursorClosed(); } } ~~~ 至此,服务端的close函数就分析完毕。内容较简单,无需详述。 现在来回答本节最开始提出的问题,如果没有显示调用游标对象的close函数,那么该对象被垃圾回收时是否会调用close函数呢?下面用代码来回答这个问题。