ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、视频、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
服务端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函数呢?下面用代码来回答这个问题。