android.view.WindowLeaked 的錯誤問題
09-17 23:03:38.954: E/WindowManager(1994): android.view.WindowLeaked: Activity app.ui.MainActivity has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView{b2d3d4e0 V.E..... R.....I. 0,0-280,139} that was originally added here
09-17 23:03:38.954: E/WindowManager(1994): at android.view.ViewRootImpl.<init>(ViewRootImpl.java:348)
09-17 23:03:38.954: E/WindowManager(1994): at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:248)
09-17 23:03:38.954: E/WindowManager(1994): at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:69)
09-17 23:03:38.954: E/WindowManager(1994): at android.app.Dialog.show(Dialog.java:286)
09-17 23:03:38.954: E/WindowManager(1994): at app.ui.MainActivity.showExitDialog(MainActivity.java:69)
09-17 23:03:38.954: E/WindowManager(1994): at app.ui.MainActivity.onKeyDown(MainActivity.java:48)
09-17 23:03:38.954: E/WindowManager(1994): at android.view.KeyEvent.dispatch(KeyEvent.java:2640)
09-17 23:03:38.954: E/WindowManager(1994): at android.app.Activity.dispatchKeyEvent(Activity.java:2423)
09-17 23:03:38.954: E/WindowManager(1994): at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchKeyEvent(PhoneWindow.java:1962)
09-17 23:03:38.954: E/WindowManager(1994): at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3418)
09-17 23:03:38.954: E/WindowManager(1994): at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:3558)
09-17 23:03:38.954: E/WindowManager(1994): at android.view.ViewRootImpl$ImeInputStage.onFinishedInputEvent(ViewRootImpl.java:3718)
09-17 23:03:38.954: E/WindowManager(1994): at android.view.inputmethod.InputMethodManager$PendingEvent.run(InputMethodManager.java:2010)
09-17 23:03:38.954: E/WindowManager(1994): at android.view.inputmethod.InputMethodManager.invokeFinishedInputEventCallback(InputMethodManager.java:1704)
09-17 23:03:38.954: E/WindowManager(1994): at android.view.inputmethod.InputMethodManager.finishedInputEvent(InputMethodManager.java:1695)
09-17 23:03:38.954: E/WindowManager(1994): at android.view.inputmethod.InputMethodManager$ImeInputEventSender.onInputEventFinished(InputMethodManager.java:1987)
09-17 23:03:38.954: E/WindowManager(1994): at android.view.InputEventSender.dispatchInputEventFinished(InputEventSender.java:141)
09-17 23:03:38.954: E/WindowManager(1994): at android.os.MessageQueue.nativePollOnce(Native Method)
09-17 23:03:38.954: E/WindowManager(1994): at android.os.MessageQueue.next(MessageQueue.java:138)
09-17 23:03:38.954: E/WindowManager(1994): at android.os.Looper.loop(Looper.java:123)
09-17 23:03:38.954: E/WindowManager(1994): at android.app.ActivityThread.main(ActivityThread.java:5017)
09-17 23:03:38.954: E/WindowManager(1994): at java.lang.reflect.Method.invokeNative(Native Method)
09-17 23:03:38.954: E/WindowManager(1994): at java.lang.reflect.Method.invoke(Method.java:515)
09-17 23:03:38.954: E/WindowManager(1994): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
09-17 23:03:38.954: E/WindowManager(1994): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
09-17 23:03:38.954: E/WindowManager(1994): at dalvik.system.NativeStart.main(Native Method)
首先說明:這個錯誤不屬於記憶體溢位,而是android中的窗體溢位。
1.Activity 的生命週期與 Dialog 的不一樣 AlertDialog.Builder builder=new AlertDialog.Builder(context);
2.這個context 是Activity的上下文
3.Dialog 要在Activity 銷燬前 dismiss()掉,不然就窗體溢位
所以在解決此問題時,要判斷窗體是否關閉,再幹掉Activity
/**
* 捕獲返回按鈕事件
*/
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK) {
showExitDialog();
return false;
} else {
return super.onKeyDown(keyCode, event);
}
}
//退出提示
protected void showExitDialog() {
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("提示");
builder.setMessage("您確定要退出麼?");
builder.setNegativeButton("取消", null);
builder.setPositiveButton("退出", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
MainActivity.this.finish();
dialog.cancel();//取消dialog,或dismiss掉
}
});
if (!isFinishing()) {
builder.create().show();
}
}
原因:Android的每一個Activity都有個WindowManager窗體管理器,同樣,構建在某個Activity之上的對話方塊、PopupWindow也有相應的WindowManager窗體管理器。但是它們不能脫離Activity而單獨存在著,因為需要Activity的Context,所以當某個Dialog或者某個PopupWindow正在顯示的時候我們幹掉了承載該Dialog(或PopupWindow)的Activity,就會拋Window Leaked異常了,因為這個Dialog(或PopupWindow)的WindowManager已經沒有誰可以附屬了(Context)。
在android中常常會遇到與context有關的內容,淺論一下context : 在語句 AlertDialog.Builder builder = new AlertDialog.Builder(this); 中,要求傳遞的引數就是一個context,在這裡傳入的是this,那麼這個this究竟指的是什麼東東呢? 這裡的this指的是Activity.this,是當前這個Activity 的上下文(Context)。
網上有很多朋友在這裡傳入this.getApplicationContext(),這是不對的。為什麼? AlertDialog物件是依賴於一個View的,而View是和一個Activity對應的。 於是,這裡涉及到一個生命週期的問題,this.getApplicationContext()取的是整個應用程式的Context,Activity.this取的是這個Activity的Context,這兩者的生命週期是不同 的,前者的生命週期是整個應用,後者的生命週期只是它所在的Activity。而AlertDialog應該是屬於一個Activity的,在Activity銷燬的時候它也就銷燬了,不會再存在;但是,如果傳入this.getApplicationContext(),就表示它的生命週期是整個應用程式,這顯然超過了它 的生命週期了。
所以,在這裡只能使用Activity的this。 差別就是不同的生命週期。
相關文章
- mysql的時區錯誤問題MySql
- 解決 ngrok 的 Domain 錯誤問題AI
- 微信支付錯誤兩個問題的解決:curl出錯,錯誤碼:60
- Double型別精度問題引起的錯誤型別
- 關於PHP 時區錯誤的問題PHP
- Windows重置網路卡錯誤問題Windows
- CodeBlocks偵錯程式設定錯誤問題BloC
- 八皇后問題的錯誤程式碼示範
- sqlplus註釋行號錯誤的問題SQL
- Oracle 常見的錯誤問題及解決方法Oracle
- ftp到ASM磁碟組路徑錯誤的問題FTPASM
- OPENSSL問題,使用fsockopen()函式提示錯誤函式
- 交流(1)-- 執行計劃錯誤問題
- JavaScript 中遇到的錯誤問題,該怎麼處理?JavaScript
- 解決儲存過程擷取錯誤的問題儲存過程
- EBS會計科目類別設定錯誤的問題
- GoldenGate MSSQL Oracle的主鍵問題導致的錯誤GoSQLOracle
- 從錯誤的RAID5中發現的問題AI
- Db2 位元組問題&Db2-4229 錯誤問題DB2
- Auth::logoutOtherDevices 導致密碼錯誤問題Godev密碼
- Oracle 錯誤總結及問題解決 ORAOracle
- Docker Quickstart Terminal 初始化錯誤問題DockerUI
- mysql insert語句錯誤問題解決MySql
- logical standby DG同步錯誤問題總結
- 解決python中文編碼錯誤問題Python
- 【SSH】--框架搭建錯誤及專案中問題框架
- MySql中SUM函式計算錯誤問題MySql函式
- 這種錯誤怎麼解決??pojoService問題,反射機制問題嗎?POJO反射
- Vagrant 啟動 VirtualBox 的問題 ( 誤裝 docker 後報錯 )Docker
- insert中啟用錯誤日誌的問題及分析
- 一個不知道產生錯誤原因的javascript的問題。JavaScript
- 解決一切listview或者adapter等類似的資料錯誤,點選錯誤的問題。ViewAPT
- python問題:IndentationError:expected an indented block錯誤解決PythonErrorBloC
- 如何解決url傳參導致錯誤問題
- C語言初學者常見問題與錯誤C語言
- 錯誤思維導向致IT專案問題多
- dblink建立後訪問提示密碼錯誤問題解決密碼
- 工程make時出現"時鐘錯誤的問題"的解決方案