<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>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                #### 8.2.2 Window的刪除過程 Window的刪除過程和添加過程一樣,都是先通過WindowManagerImpl后,再進一步通過WindowManagerGlobal來實現的。下面是WindowManagerGlobal的removeView的實現: public void removeView(View view, boolean immediate) { if (view == null) { throw new IllegalArgumentException("view must not be null"); } synchronized (mLock) { int index = findViewLocked(view, true); View curView = mRoots.get(index).getView(); removeViewLocked(index, immediate); if (curView == view) { return; } throw new IllegalStateException("Calling with view " + view + " but the ViewAncestor is attached to " + curView); } } removeView的邏輯很清晰,首先通過findViewLocked來查找待刪除的View的索引,這個查找過程就是建立的數組遍歷,然后再調用removeViewLocked來做進一步的刪除,如下所示。 private void removeViewLocked(int index, boolean immediate) { ViewRootImpl root = mRoots.get(index); View view = root.getView(); if (view ! = null) { InputMethodManager imm = InputMethodManager.getInstance(); if (imm ! = null) { imm.windowDismissed(mViews.get(index).getWindowToken()); } } boolean deferred = root.die(immediate); if (view ! = null) { view.assignParent(null); if (deferred) { mDyingViews.add(view); } } } removeViewLocked是通過ViewRootImpl來完成刪除操作的。在WindowManager中提供了兩種刪除接口removeView和removeViewImmediate,它們分別表示異步刪除和同步刪除,其中removeViewImmediate使用起來需要特別注意,一般來說不需要使用此方法來刪除Window以免發生意外的錯誤。這里主要說異步刪除的情況,具體的刪除操作由ViewRoot-Impl的die方法來完成。在異步刪除的情況下,die方法只是發送了一個請求刪除的消息后就立刻返回了,這個時候View并沒有完成刪除操作,所以最后會將其添加到mDyingViews中,mDyingViews表示待刪除的View列表。ViewRootImpl的die方法如下所示。 boolean die(boolean immediate) { // Make sure we do execute immediately if we are in the middle of a traversal or the damage // done by dispatchDetachedFromWindow will cause havoc on return. if (immediate && ! mIsInTraversal) { doDie(); return false; } if (! mIsDrawing) { destroyHardwareRenderer(); } else { Log.e(TAG, "Attempting to destroy the window while drawing! \n" + " window=" + this + ", title=" + mWindowAttributes. getTitle()); } mHandler.sendEmptyMessage(MSG_DIE); return true; } 在die方法內部只是做了簡單的判斷,如果是異步刪除,那么就發送一個MSG_DIE的消息,ViewRootImpl中的Handler會處理此消息并調用doDie方法,如果是同步刪除(立即刪除),那么就不發消息直接調用doDie方法,這就是這兩種刪除方式的區別。在doDie內部會調用dispatchDetachedFromWindow方法,真正刪除View的邏輯在dispatchDetachedFromWindow方法的內部實現。dispatchDetachedFromWindow方法主要做四件事: * (1)垃圾回收相關的工作,比如清除數據和消息、移除回調。 * (2)通過Session的remove方法刪除Window:mWindowSession.remove(mWindow),這同樣是一個IPC過程,最終會調用WindowManagerService的removeWindow方法。 * (3)調用View的dispatchDetachedFromWindow方法,在內部會調用View的onDetached-FromWindow()以及onDetachedFromWindowInternal()。對于onDetachedFromWindow()大家一定不陌生,當View從Window中移除時,這個方法就會被調用,可以在這個方法內部做一些資源回收的工作,比如終止動畫、停止線程等。 * (4)調用WindowManagerGlobal的doRemoveView方法刷新數據,包括mRoots、mParams以及mDyingViews,需要將當前Window所關聯的這三類對象從列表中刪除。
                  <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>

                              哎呀哎呀视频在线观看