<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                客戶端拿到的游標對象的真實類型是CursorWrapperInner,其close函數的代碼如下: **ContentResolver.java::CursorWrapperInner.close** ~~~ public void close() { super.close();//調用基類的close函數 //撤銷客戶端進程和目標CP進程的親密關系 ContentResolver.this.releaseProvider(mContentProvider); mProviderReleased = true; if(mCloseGuard != null) mCloseGuard.close(); } ~~~ 下面來看CursorWrapperInner的基類CursorWrapper的close函數。須提醒讀者注意,后文對函數分析會頻繁從基類轉到子類,又從子類轉到基類。造成這種局面的原因就是對類封裝得太利害的結果。 **CursorWrapper.java::close** ~~~ public void close() { mCursor.close(); //mCursor指向BulkCursorToCursorAdaptor } ~~~ BulkCursorToCursorAdaptorclose的代碼如下: **BulkCurosrToCursorAdaptor.java::close** ~~~ public void close() { super.close();//①再次調用基類close函數,該函數會釋放本地創建的CursorWindow資源 if(mBulkCursor != null) { try { mBulkCursor.close();//②調用遠端對象的close函數 }...... finally { mBulkCursor = null; } } } ~~~ 對于Cursor close函數來說,筆者更關注其中所包含的CursorWindow資源是如何釋放的。根據以上代碼中的注釋可知,BulkCurosrToCursorAdaptor的close調用的基類close函數會釋放CursorWindow。 接下來來看super.close這個函數。這個close由BulkCurosrToCursorAdaptor的父類AbstractWindowedCursor的父類AbstractCursor實現,其代碼如下: **AbstractCursor.java::close** ~~~ public void close() { mClosed =true; mContentObservable.unregisterAll(); onDeactivateOrClose();//調用子類實現的onDeactivateOrClose函數 } ~~~ onDeactivateOrClose由AbstractCursor的子類AbstractWindowedCursor實現,代碼如下: **AbstractWindowedCursor.java::onDeactivateOrClose** ~~~ protected void onDeactivateOrClose() { //又調用基類即AbstractCursor的onDeactivateOrClose函數 super.onDeactivateOrClose(); closeWindow();//釋放CursorWindow資源 } ~~~ close函數涉及的調用居然在派生樹中如此反復出現,這讓人無奈-!后面還會碰到類似的做法,讀者務必保持鎮靜。 **AbstractWindowedCursor.java::close** ~~~ protected void closeWindow() { if(mWindow != null) { mWindow.close();//調用CurosrWindow的close函數 mWindow = null; } } ~~~ CursorWindow從SQLiteClosable派生,根據前面的介紹,釋放SQLiteClosable代表的資源會利用引用計數來控制,這是如何實現的呢?來看代碼: **CursorWindow.java::close** ~~~ public void close() { releaseReference();//減少一次引用計數 } ~~~ releaseReference由CursorWindow的基類SQLiteClosable實現,其代碼如下: **SQLiteClosable.java::releaseReference** ~~~ public void releaseReference() { booleanrefCountIsZero = false; synchronized(this) { refCountIsZero = --mReferenceCount == 0; } if(refCountIsZero) {//當引用計數減為0時,就可以真正釋放資源了 onAllReferencesReleased();//調用子類實現的onAllReferencesReleased函數 } } ~~~ 資源釋放的工作由子類實現的onAllReferencesReleased完成,對CursorWindow來說,該函數的代碼如下: **CursorWindow.java::onAllReferencesReleased** ~~~ protected void onAllReferencesReleased() { dispose();//調用dispose } private void dispose() { if(mCloseGuard != null) { mCloseGuard.close(); } if(mWindowPtr != 0) { recordClosingOfWindow(mWindowPtr); //調用nativeDispose函數,該函數內部會釋放Native層的CursorWindow對象 //至此,客戶端獲取的那塊共享內存就徹底釋放干凈了 nativeDispose(mWindowPtr); mWindowPtr = 0; } } ~~~ 至此,客戶端游標對象的close函數已分析完畢,不知讀者看完整個流程后有何感想。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看