2014-02-16 61 views
24

看看這些作品的代碼:活動已泄漏的窗口 - Android電子

Custom views and window attributes on Android

問題

當我點擊 'Home鍵',exception拋出:Activity已泄漏窗口.. 。from this line:

localWindowManager.addView(colourView, layoutParams); 

Questi (s)

你知道是什麼原因造成的嗎?

問題不會發生,當我用後退按鈕關閉應用程序。

異常/錯誤日誌

W/InputManagerService( 96): Starting input on non-focused client [email protected] (uid=10056 pid=1368) 
D/CordovaActivity(1368): CordovaActivity.onDestroy() 
D/CordovaWebView(1368): >>> loadUrlNow() 
E/WindowManager(1368): Activity com.phonegap.helloworld.HelloWorld has leaked window [email protected] that was originally added here 
E/WindowManager(1368): android.view.WindowLeaked: Activity com.phonegap.helloworld.HelloWorld has leaked window [email protected] that was originally added here 
E/WindowManager(1368):   at android.view.ViewRoot.<init>(ViewRoot.java:258) 
E/WindowManager(1368):   at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:148) 
E/WindowManager(1368):   at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:91) 
E/WindowManager(1368):   at android.view.Window$LocalWindowManager.addView(Window.java:424) 
E/WindowManager(1368):   at pl.edu.uj.tcs.student.xxx.Display.setColorsViews(Display.java:181) 
E/WindowManager(1368):   at pl.edu.uj.tcs.student.xxx.Display$3.run(Display.java:139) 
E/WindowManager(1368):   at android.os.Handler.handleCallback(Handler.java:587) 
E/WindowManager(1368):   at android.os.Handler.dispatchMessage(Handler.java:92) 
E/WindowManager(1368):   at android.os.Looper.loop(Looper.java:130) 
E/WindowManager(1368):   at android.app.ActivityThread.main(ActivityThread.java:3683) 
E/WindowManager(1368):   at java.lang.reflect.Method.invokeNative(NativeMethod) 
E/WindowManager(1368):   at java.lang.reflect.Method.invoke(Method.java:507) 
E/WindowManager(1368):   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839) 
E/WindowManager(1368):   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597) 
E/WindowManager(1368):   at dalvik.system.NativeStart.main(Native Method) 

D/CordovaActivity(1368): onMessage(onPageStarted,about:blank) 
D/CordovaWebViewClient(1368): onPageFinished(about:blank) 
D/CordovaActivity(1368): onMessage(onPageFinished,about:blank) 
D/CordovaActivity(1368): onMessage(exit,null) 
I/power ( 96): *** set_screen_state 0 

編輯:

我怎樣才能在科爾多瓦活動添加東西的onPause()的onStop()等函數?

編輯2:

爲什麼是一個問題?因爲我創建的所有類都擴展了CordovaPlugin和小型輔助類。就這樣。我不能(我想)修改Activity類的主體。我所能做的就是通過調用cordova.getActivity()函數來獲得它的參考。

+0

請從logcat中附上完整的堆棧跟蹤。 – ntv1000

+0

附帶Stacktrace。 – tomwesolowski

回答

46

什麼是編程泄漏?

您獲取並且不釋放的內存導致內存泄漏。類似於(窗口/對話框)發生。

這裏發生了什麼?

你正試圖添加一個窗口,當它顯示它在前臺時,但是當你按下home按鈕時,它會暫停然後停止(嘗試在onStop()和onPause ())。

由於您沒有告訴系統刪除​​您的視圖,因此它仍然附着到現在已經從應用程序中消失/分離的窗口。因此,根據系統,您的customView佔據了它未釋放的空間。

解決方案

裏面你onStop() or onPause()onDestroy()確保您關閉您的視圖(dismiss()如果它是一個對話框)或者(如果使用的窗口管理器添加remove())將其刪除。

在你的卸載函數中添加關閉或刪除函數,正如你所提到的那樣,在按下按鈕時,你會得到這個錯誤。在退出應用程序時,它的onUnload()方法被調用。

建議(忽略如果不是在上下文中)

,我可以看到你正在試圖做出過來it.Adding這類的活動彈出窗口的下方任何一個系統警告窗口是危險的它可能會導致泄漏問題。 您可以通過Service實際添加此類窗口,因此它會超越你的活動,處處顯示了該設備上(如果那是你所需要的)。

Check this out

更新2-科爾多瓦生命週期

你爲什麼不嘗試覆蓋onunload的方法在你的CordovaPlugin class.I試圖尋找,但docs都在提的onPause和的onResume的存在方法。如果你在CordovaPlugin類中獲得了onUnload,那麼刪除你在視圖類runOnUiThread方法中所做的視圖。當你的背景顯示的對話框和這方面突然用力貼近您的對話框沒有正確駁回

+0

感謝您的回答。請閱讀編輯說明。 – tomwesolowski

+0

沒有冒犯,但我不明白你的編輯note.It似乎含糊不清,請更具體,以便我可以幫你輕鬆。 – cafebabe1991

+0

我該怎麼做? – tomwesolowski

11

您試圖在退出活動後顯示Dialog

解決方法是在退出Activity之前創建的Dialog上調用dismiss(),例如,在onPause()中。在離開Activity之前,所有窗口&對話框應該關閉。

@Override 
protected void onStop() { 
    super.onStop(); 
    if (loadingDlg != null) { 
    loadingDlg.dismiss(); 
    loadingDlg = null; 
    } 
} 

希望它對你有幫助。

Activity-has-leaked-window-that-was-originally-added

+0

請閱讀編輯說明。 – tomwesolowski

+0

爲了記錄,我以前有過這個問題。由於通過回調顯示對話框的時間,所以在嘗試顯示對話框並對其進行壓制時,除了想要嘗試將所有回調與狀態同步活動)。 –

+0

@Tomek,你可以發佈活動和科爾多瓦類... – Jeba

0

泄露的窗口通常發生。

爲了解決這個問題,你有窗口已泄漏錯誤之前修正錯誤。

1

檢查天氣對話框顯示或不

@Override 
    protected void onStop() { 
    super.onStop(); 
if (loadingDlg != null) { 

     if(loadingDlg.isShowing()) 
     loadingDlg.dismiss(); 

     loadingDlg = null; 
} 
} 
0

我有一個結束()被調用的地方我AlertDialog叫這引起了活動完成AlertDialog被稱爲前前。我刪除了finish()並將其放在用戶使用AlertDialog完成輸入之後,並且修復了窗口泄漏。

相關問題