2013-07-01 119 views
1

我有以下代碼用於顯示自定義彈出窗口,但執行相同的導致泄漏窗口錯誤,我無法確定如何解決它。以下是我的代碼:自定義彈出窗口導致泄漏窗口。

public void Reminder() { 
    dDialog = new Dialog(Farrier.this); 
    dDialog.setContentView(R.layout.farrierpop2); 
    dDialog.setTitle("Reminder"); 
    dDialog.setCancelable(true); 
    final Button pop1 = (Button) dDialog.findViewById(R.id.Btn1); 
    pop1.setOnClickListener(new OnClickListener() { 
     public void onClick(View v) { 
      Intent intent = new Intent(Intent.ACTION_EDIT); 
      intent.setType("vnd.android.cursor.item/event"); 
      intent.putExtra("title", IDB); 
      intent.putExtra("description", "Farrier Service"); 
      intent.putExtra("beginTime", "eventStartInMillis"); 
      intent.putExtra("endTime", "eventEndInMillis"); 
      startActivity(intent); 
      finish(); 
     } 
    }); 
    Button pop2 = (Button) dDialog.findViewById(R.id.Btn2); 
    pop2.setOnClickListener(new OnClickListener() { 
     public void onClick(View v) { 
      // dDialog.dismiss(); 
      Intent ourpartner = new Intent(Farrier.this, FarrierSch.class); 
      startActivity(ourpartner); 
      finish(); 
     } 
    }); 
    dDialog.show(); 
} 

堆棧跟蹤是:

*07-01 11:30:18.646: E/WindowManager(407): Activity com.gallops.Farrier has leaked window [email protected] that was originally added here 
07-01 11:30:18.646: E/WindowManager(407): android.view.WindowLeaked: Activity com.gallops.Farrier has leaked window [email protected] that was originally added here 
07-01 11:30:18.646: E/WindowManager(407): at android.view.ViewRoot.<init>(ViewRoot.java:227) 
07-01 11:30:18.646: E/WindowManager(407): at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:148) 
07-01 11:30:18.646: E/WindowManager(407): at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:91) 
07-01 11:30:18.646: E/WindowManager(407): at android.view.Window$LocalWindowManager.addView(Window.java:424) 
07-01 11:30:18.646: E/WindowManager(407): at android.app.Dialog.show(Dialog.java:239) 
07-01 11:30:18.646: E/WindowManager(407): at com.gallops.Farrier.Reminder(Farrier.java:185) 
07-01 11:30:18.646: E/WindowManager(407): at com.gallops.Farrier$2.onClick(Farrier.java:915) 
07-01 11:30:18.646: E/WindowManager(407): at android.view.View.performClick(View.java:2364) 
07-01 11:30:18.646: E/WindowManager(407): at android.view.View.onTouchEvent(View.java:4179) 
07-01 11:30:18.646: E/WindowManager(407): at android.widget.TextView.onTouchEvent(TextView.java:6541) 
07-01 11:30:18.646: E/WindowManager(407): at android.view.View.dispatchTouchEvent(View.java:3709) 
07-01 11:30:18.646: E/WindowManager(407): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884) 
07-01 11:30:18.646: E/WindowManager(407): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884) 
07-01 11:30:18.646: E/WindowManager(407): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884) 
07-01 11:30:18.646: E/WindowManager(407): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884) 
07-01 11:30:18.646: E/WindowManager(407): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884) 
07-01 11:30:18.646: E/WindowManager(407): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884) 
07-01 11:30:18.646: E/WindowManager(407): at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1659) 
07-01 11:30:18.646: E/WindowManager(407): at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1107) 
07-01 11:30:18.646: E/WindowManager(407): at android.app.Activity.dispatchTouchEvent(Activity.java:2061) 
07-01 11:30:18.646: E/WindowManager(407): at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1643) 
07-01 11:30:18.646: E/WindowManager(407): at android.view.ViewRoot.handleMessage(ViewRoot.java:1691) 
07-01 11:30:18.646: E/WindowManager(407): at android.os.Handler.dispatchMessage(Handler.java:99) 
07-01 11:30:18.646: E/WindowManager(407): at android.os.Looper.loop(Looper.java:123) 
07-01 11:30:18.646: E/WindowManager(407): at android.app.ActivityThread.main(ActivityThread.java:4363) 
07-01 11:30:18.646: E/WindowManager(407): at java.lang.reflect.Method.invokeNative(Native Method) 
07-01 11:30:18.646: E/WindowManager(407): at java.lang.reflect.Method.invoke(Method.java:521) 
07-01 11:30:18.646: E/WindowManager(407): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860) 
07-01 11:30:18.646: E/WindowManager(407): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618) 
07-01 11:30:18.646: E/WindowManager(407): at dalvik.system.NativeStart.main(Native Method)* 
+2

在完成活動之前關閉對話框。 – NaserShaikh

+0

就像一個魅力,在答案框中鍵入這個,我會接受它! – Skynet

+0

高興地幫助.. – NaserShaikh

回答

1

你完成,你必須摒棄對話第一和 你必須設置onCancleListener到您的對話框,並在onCancleListener開始其他活動,完成本次活動

dDialog.setOnCancleListener(); 

@Override 
onCancle() 
{ 
startactivityone(); 

OR 

startactivitytwo(); 
} 

public void Reminder() { 
dDialog = new Dialog(Farrier.this); 
dDialog.setContentView(R.layout.farrierpop2); 
dDialog.setTitle("Reminder"); 
dDialog.setCancelable(true); 
final Button pop1 = (Button) dDialog.findViewById(R.id.Btn1); 
pop1.setOnClickListener(new OnClickListener() { 
    public void onClick(View v) { 
     Intent intent = new Intent(Intent.ACTION_EDIT); 
     intent.setType("vnd.android.cursor.item/event"); 
     intent.putExtra("title", IDB); 
     intent.putExtra("description", "Farrier Service"); 
     intent.putExtra("beginTime", "eventStartInMillis"); 
     intent.putExtra("endTime", "eventEndInMillis"); 
     startActivity(intent); 
     finish(); 
    } 
}); 
Button pop2 = (Button) dDialog.findViewById(R.id.Btn2); 
pop2.setOnClickListener(new OnClickListener() { 
    public void onClick(View v) { 
     // dDialog.dismiss(); 
     Intent ourpartner = new Intent(Farrier.this, FarrierSch.class); 
     startActivity(ourpartner); 
     finish(); 
    } 
}); 
dDialog.show(); 
} 
0

使用對話片段。對話框已棄用。 (可能是由於這些問題)。

+0

看到這篇文章,它解釋瞭如何使用片段內的對話框。 http://android-developers.blogspot.com/2012/05/using-dialogfragments.html – pixel

1

嘗試dismiss您的對話框 的父活動您dialogexisting當前的activity

if(dDialog.isShowing()){ 
    dDialog.dismiss(); 
    } 
+0

這應該是正確的。 – Veeru

0

在我的情況,我打電話完成()從在彈出窗口中。這是一臺錄像機,顯示一個標題欄,頂部有一個關閉按鈕。該活動在彈出窗口中關閉按鈕後關閉。

這顯然導致泄漏,因爲在調用finish()時彈出窗口仍然顯示。通過檢查彈出窗口是否在parentActivity中可見並將其關閉來對此進行分類

@Override 
    protected void onDestroy() { 
     super.onDestroy(); 
     if (mVideoView != null) { 
      mVideoView = null; 

     } 
     if(mMediaController.isShowing()){ 
      mMediaController.hide(); 
      mMediaController=null;   
     } 
    }