2013-05-28 35 views
2

我有一個名爲requestLocation的方法,即啓動一個進度對話框。我從onResume()調用這個方法;進度對話框導致「窗口泄漏」

我的方法:

public void requestLocation() { 
    try { 
     progressDialog = ProgressDialog.show(this, "", "Obtaining Location Service", true); 
    } 
    catch(Exception e) { 

    } 

    updates=0; 
    startingLocal = null; 
    latestLocal = null; 
    gps = null; 
    gps = new KNLocationService(this); 
    gps.setParent(this); 
    // check if GPS enabled 
    if (gps.canGetLocation()) { 

     double latitude = gps.getLatitude(); 
     double longitude = gps.getLongitude(); 

     //progressDialog.dismiss(); 
     //locationServiceText.setText("Aquiring location"); 

    } else { 
     try { 
      progressDialog.dismiss(); 
     } catch (Exception e) { 

     } 

     locationServiceText.setText("No LocationService Provided"); 
    } 

} 

,但我發現了以下錯誤是我假設是因爲進度對話框,但我似乎無法找出到底是什麼原因造成它..

05-28 09:50:12.615: E/WindowManager(13774): Activity com.KingNozzle.KNAugmentedRealityActivity has leaked window [email protected] that was originally added here 
05-28 09:50:12.615: E/WindowManager(13774): android.view.WindowLeaked: Activity com.KingNozzle.KNAugmentedRealityActivity has leaked window [email protected] that was originally added here 
05-28 09:50:12.615: E/WindowManager(13774):  at android.view.ViewRootImpl.<init>(ViewRootImpl.java:374) 
05-28 09:50:12.615: E/WindowManager(13774):  at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:292) 
05-28 09:50:12.615: E/WindowManager(13774):  at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:224) 
05-28 09:50:12.615: E/WindowManager(13774):  at android.view.WindowManagerImpl$CompatModeWrapper.addView(WindowManagerImpl.java:149) 
05-28 09:50:12.615: E/WindowManager(13774):  at android.view.Window$LocalWindowManager.addView(Window.java:547) 
05-28 09:50:12.615: E/WindowManager(13774):  at android.app.Dialog.show(Dialog.java:277) 
05-28 09:50:12.615: E/WindowManager(13774):  at android.app.ProgressDialog.show(ProgressDialog.java:116) 
05-28 09:50:12.615: E/WindowManager(13774):  at android.app.ProgressDialog.show(ProgressDialog.java:99) 
05-28 09:50:12.615: E/WindowManager(13774):  at com.KingNozzle.KNAugmentedRealityActivity.requestLocation(KNAugmentedRealityActivity.java:494) 
05-28 09:50:12.615: E/WindowManager(13774):  at com.KingNozzle.KNAugmentedRealityActivity.onResume(KNAugmentedRealityActivity.java:162) 
05-28 09:50:12.615: E/WindowManager(13774):  at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1184) 
05-28 09:50:12.615: E/WindowManager(13774):  at android.app.Activity.performResume(Activity.java:5082) 
05-28 09:50:12.615: E/WindowManager(13774):  at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2565) 
05-28 09:50:12.615: E/WindowManager(13774):  at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:2603) 
05-28 09:50:12.615: E/WindowManager(13774):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2089) 
05-28 09:50:12.615: E/WindowManager(13774):  at android.app.ActivityThread.access$600(ActivityThread.java:130) 
05-28 09:50:12.615: E/WindowManager(13774):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1195) 
05-28 09:50:12.615: E/WindowManager(13774):  at android.os.Handler.dispatchMessage(Handler.java:99) 
05-28 09:50:12.615: E/WindowManager(13774):  at android.os.Looper.loop(Looper.java:137) 
05-28 09:50:12.615: E/WindowManager(13774):  at android.app.ActivityThread.main(ActivityThread.java:4745) 
05-28 09:50:12.615: E/WindowManager(13774):  at java.lang.reflect.Method.invokeNative(Native Method) 
05-28 09:50:12.615: E/WindowManager(13774):  at java.lang.reflect.Method.invoke(Method.java:511) 
05-28 09:50:12.615: E/WindowManager(13774):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786) 
05-28 09:50:12.615: E/WindowManager(13774):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 
05-28 09:50:12.615: E/WindowManager(13774):  at dalvik.system.NativeStart.main(Native Method) 

我似乎沒有崩潰的應用程序,但我仍然想改正這一點。

+1

http://stackoverflow.com/questions/2850573/activity-has-leaked-window-that-was-originally-added – Raghunandan

回答

1
if (gps.canGetLocation()) 
    // Then progress dialog will not be dismissed. 

這是造成泄漏。任務完成後關閉對話框。

+0

即使我不想要在那裏解僱它,在gps更新的方法中,我仍然想用不同的消息顯示它? – erik

+0

@erik。沒問題..只是在所有任務完成時關閉對話框。我相信你不想顯示無窮大的對話框。顯示泄漏是因爲您沒有忽略對話。如果您想在活動生命週期中顯示,請在onPause關閉它 – stinepike

4

你必須摒棄對話框:

@Override 
protected void onDestroy() { 
    super.onDestroy(); 
    progressDialog.dismiss(); 
}