# 描述 針對 [Vinnysoft - android.view.WindowManager$BadTokenException & Android – Displaying Dialogs From Background Threads](https://vinnysoft.blogspot.com/2010/11/androidviewwindowmanagerbadtokenexcepti.html) 文章做的重點整理 ## 1. **背景線程與對話框顯示:** - 背景線程常用於處理複雜或耗時的任務。 - 通常,希望在背景任務完成後通知用戶,這時可能會使用對話框在UI線程顯示消息。 ## 2. **BadTokenException例外:** - 作者在Google Play開始提供崩潰報告後,發現了一個android.view.WindowManager$BadTokenException的例外。 - 這個例外通常在嘗試在UI線程上顯示對話框時出現。 ## 3. **例外的原因:** - 當背景線程完成任務後,嘗試在UI線程上顯示對話框,而此時Activity可能正在銷毀的過程中。 - 當Activity處於銷毀過程中,顯示對話框可能導致BadTokenException。 ## 4. **錯誤訊息:** - BadTokenException錯誤訊息中提到:`Unable to add window — token android.os.BinderProxy@447a6748 is not valid; is your activity running?` ## 5. **問題的根本原因:** - 背景線程和UI線程運行獨立,用戶可能在背景線程執行時與應用程序進行交互。 - 當用戶在背景線程執行時按下“返回”按鈕,而Activity正在銷毀,此時顯示對話框可能導致應用程序崩潰。 ## 6. **解決辦法:** - 在顯示對話框之前,使用`isFinishing()`方法檢查Activity是否處於銷毀過程中,以避免在此時顯示對話框。 - 作者提供的解決辦法是在Handler中的顯示對話框代碼中添加檢查,如下: ```java private Handler myHandler = new Handler() { @Override public void handleMessage(Message msg) { switch (msg.what) { case DISPLAY_DLG: if (!isFinishing()) { showDialog(MY_DIALOG); } break; } } }; ``` ## 7. **總結:** - 在處理背景線程和UI線程交互時,要注意可能的Activity銷毀情況,以避免BadTokenException。 # 專業術語 * Handler(處理程序): 用於在不同線程之間傳遞和處理消息的Android類。 * AsyncTask(異步任務): Android提供的用於在後台執行任務並在UI線程上顯示結果的工具類。 * BadTokenException(無效令牌異常): Android中的一種異常,通常發生在嘗試在無效的上下文中添加視窗時,例如嘗試在Activity正在銷毀的過程中顯示對話框時。 * ViewRoot: Android中的類,負責管理視圖樹的根節點。 * WindowManagerImpl: Android中的窗口管理實現,負責添加和管理應用程序窗口。 * BinderProxy: Android中的一種代理對象,用於在不同進程之間進行通信。 * isFinishing(): Activity中的方法,用於檢查Activity是否處於結束(銷毀)階段。 * Back Button(返回按鈕): Android設備上的物理按鈕,用於返回到前一個屏幕或關閉當前活動。 * Virtual Machine(虛擬機): 在Android中,指的是運行Dalvik虛擬機(DVM)或Art虛擬機(Android Runtime)的虛擬機器。 * 崩潰報告: 當應用程序發生異常並終止時,系統生成的包含錯誤信息的報告,開發人員可以用來追蹤和修復問題。 * Activity(活動): Android應用程序中的基本組件之一,代表用戶界面上的單個屏幕,用於互動。 * UI線程(User Interface Thread): 在Android中,UI線程是負責處理與用戶界面相關的操作和事件的主要線程。 * 背景線程: 在UI線程之外運行的線程,通常用於處理耗時的任務,以避免阻塞UI線程。 * Android Background(Android後台): 指應用程序中在用戶不直接與之交互的部分,例如在應用程序在後台運行時執行的任務。 * 線程(Thread): 在計算機科學中,線程是執行程序中的最小單位,可以在獨立的上下文中執行,允許多任務並發執行。 * 線程的Handler(Handler): 用於在Android中處理消息和任務的機制,通常用於與UI線程通信。 * AsyncTask onPostExecute(AsyncTask、onPostExecute): AsyncTask是Android提供的一種簡便方式,用於在後台執行任務,onPostExecute方法則在後台任務完成後在UI線程上執行。 * 後台任務(Background Task): 指應用程序中在後台執行的任務,通常用於處理複雜的或耗時的操作,以免阻塞UI線程。 * 後台線程(Background Thread): 在應用程序中運行的不與主UI線程相關的線程,用於執行不應影響用戶界面的任務。 * UI線程(User Interface Thread): 在Android中,UI線程是負責處理與用戶界面相關的操作和事件的主要線程。 * BadTokenException: 在Android中的一種異常,通常發生在嘗試在無效的上下文中添加視窗時,例如在Activity正在銷毀的過程中顯示對話框時。
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up