2012-08-23 56 views
0

我有一個對話框,當您單擊我的活動中的圖像時會出現。當對話框打開,用戶旋轉屏幕,下面是我的logcat所示:Android:當旋轉屏幕和對話框打開時發生窗口泄漏

08-23 09:47:47.151: E/WindowManager(15589): Activity my.activity.MyActivity has leaked window [email protected] that was originally added here 
08-23 09:47:47.151: E/WindowManager(15589): android.view.WindowLeaked: Activity my.activity.MyActivity has leaked window [email protected] that was originally added here 
08-23 09:47:47.151: E/WindowManager(15589):  at android.view.ViewRoot.<init>(ViewRoot.java:247) 
08-23 09:47:47.151: E/WindowManager(15589):  at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:148) 
08-23 09:47:47.151: E/WindowManager(15589):  at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:91) 
08-23 09:47:47.151: E/WindowManager(15589):  at android.view.Window$LocalWindowManager.addView(Window.java:424) 
08-23 09:47:47.151: E/WindowManager(15589):  at android.app.Dialog.show(Dialog.java:241) 
08-23 09:47:47.151: E/WindowManager(15589):  at tip.machine.MyActivity$8.onClick(MyActivity.java:385) 
08-23 09:47:47.151: E/WindowManager(15589):  at android.view.View.performClick(View.java:2408) 
08-23 09:47:47.151: E/WindowManager(15589):  at android.view.View$PerformClick.run(View.java:8816) 
08-23 09:47:47.151: E/WindowManager(15589):  at android.os.Handler.handleCallback(Handler.java:587) 
08-23 09:47:47.151: E/WindowManager(15589):  at android.os.Handler.dispatchMessage(Handler.java:92) 
08-23 09:47:47.151: E/WindowManager(15589):  at android.os.Looper.loop(Looper.java:123) 
08-23 09:47:47.151: E/WindowManager(15589):  at android.app.ActivityThread.main(ActivityThread.java:4627) 
08-23 09:47:47.151: E/WindowManager(15589):  at java.lang.reflect.Method.invokeNative(Native Method) 
08-23 09:47:47.151: E/WindowManager(15589):  at java.lang.reflect.Method.invoke(Method.java:521) 
08-23 09:47:47.151: E/WindowManager(15589):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:858) 
08-23 09:47:47.151: E/WindowManager(15589):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 
08-23 09:47:47.151: E/WindowManager(15589):  at dalvik.system.NativeStart.main(Native Method) 

我所做的就是通過編寫Dialog dialog全球申報的對話框,並在我的,我寫了這個:

@Override 
protected void onPause() { 
    System.out.println("IN PAUSE!"); 
    try { 
     dialog.dismiss(); 
     System.out.println("IN TRY!"); 
    } 
    catch (java.lang.NullPointerException exception) {System.out.println("IN CATCH!");} 
    super.onPause(); 
} 

如果dialog沒有實例化,我認爲catch塊會發現錯誤。無論如何,每次我旋轉,無論對話框是否打開,我只進入catch塊。當對話框打開並旋轉時,我會得到與上面相同的堆棧跟蹤(直接到catch塊)。所以它似乎從未嘗試過dialog.dismiss()這就是爲什麼我仍然收到WindowLeaked消息。

任何想法?一定是我的變量聲明/實例有問題。謝謝。

+0

我同意你的變量聲明/實例化一定是錯誤的。你可以請張貼代碼嗎? – Samuel

+0

@Samuel明白了,謝謝。如果你有興趣,請看我的答案。 – capcom

回答

0

沒關係,我明白了。問題是,我有兩個圖像都使用相同的對話框變量(觸摸時實例化它,並啓動自己的對話框)。因此,第二個圖像是通過再次聲明爲final Dialog dialog ...來引用對話框。在我將dialog設爲全局變量之前,我已這樣做了。

刪除重新聲明後,一切都是完美的。

另一方面,對於只能在不同時間啓動的兩個不同對話框使用相同的對話框變量,是否存在任何風險?

+0

只要你每次使用它們創建一個新的實例......沒有。但是如果你只是在交互之後隱藏它們來做任何後臺處理,或者想保存它們的狀態,那可能會導致問題。 – Submersed

0

如果屏幕切換橫向到縱向或縱向到橫向爲此重繪您的看法之前,重繪視圖你必須要關閉對話框

所以, 嘗試在添加此屬性android:configChanges="orientation"你的活動元素AndroidManifest.xml文件。

相關問題