2012-06-23 52 views
0

我使用這個代碼:窗口泄露甚至dialog.dismiss()

public void Close() { 
    DialogInterface.OnClickListener dialogClickListener = new DialogInterface.OnClickListener() { 

     @Override 
     public void onClick(DialogInterface dialog, int which) { 
      // TODO Auto-generated method stub 
      switch(which) { 
      case DialogInterface.BUTTON_POSITIVE: 
       dialog.dismiss(); 
       MainActivity.this.finish(); 
       break; 
      case DialogInterface.BUTTON_NEGATIVE: 
       dialog.cancel(); 
       break; 
      } 
     } 
    }; 
    final AlertDialog.Builder builder = new AlertDialog.Builder(this); 
    builder.setMessage("Thanks"); 
    builder.setPositiveButton("Quit", dialogClickListener); 
    builder.setNegativeButton("Stay", dialogClickListener); 
    MainActivity.this.runOnUiThread(new Runnable() { 
     public void run() { 
      builder.show(); 

     } 
    }); 
} 

關閉()當用戶選擇退出時被調用。它會打開一個警報框「構建器」。當我選擇的建設者「退出」,我得到這個錯誤:

 
06-23 18:32:25.230: E/WindowManager(532): Activity com.amateurprogs.championpkg.MainActivity has leaked window [email protected] that was originally added here 
06-23 18:32:25.230: E/WindowManager(532): android.view.WindowLeaked: Activity com.amateurprogs.championpkg.MainActivity has leaked window [email protected] that was originally added here 
06-23 18:32:25.230: E/WindowManager(532): at android.view.ViewRootImpl.(ViewRootImpl.java:344) 
06-23 18:32:25.230: E/WindowManager(532): at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:267) 
06-23 18:32:25.230: E/WindowManager(532): at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:215) 
06-23 18:32:25.230: E/WindowManager(532): at android.view.WindowManagerImpl$CompatModeWrapper.addView(WindowManagerImpl.java:140) 
06-23 18:32:25.230: E/WindowManager(532): at android.view.Window$LocalWindowManager.addView(Window.java:537) 
06-23 18:32:25.230: E/WindowManager(532): at android.app.Dialog.show(Dialog.java:278) 
06-23 18:32:25.230: E/WindowManager(532): at android.app.AlertDialog$Builder.show(AlertDialog.java:932) 
06-23 18:32:25.230: E/WindowManager(532): at com.amateurprogs.championpkg.MainActivity$2.run(MainActivity.java:42) 

線MainActivity.java的42指builder.show()。

關於選擇「退出」按鈕,我做了一個dialog.dismiss(),然後Activity.finish()。我仍然有一個窗戶泄漏。

爲什麼即使在dialog.dismiss()上也會出現此錯誤。

+0

有你把你的錯誤在谷歌搜索框在對話框... –

回答

0

所以起初,你的代碼是寫髒的。沒有理由將您的聽衆包裝爲close()方法,只需聲明OnClickListener就如您聲明正常方法一樣。

其次,在runOnUiThread也沒有理由撥打dialog.show()。當用戶點擊Quit Button時,只需撥打dialog.show()即可。

改變我的意思。


更新:這裏工作例如:

package com.sajmon.test; // sajmon is my old nick 

import android.app.Activity; 
import android.app.AlertDialog; 
import android.content.DialogInterface; 
import android.content.DialogInterface.OnClickListener; 
import android.os.Bundle; 
import android.view.View; 
import android.widget.Button; 

public class TestActivity extends Activity implements View.OnClickListener { 

    protected static final int CREATE_CLOSE_DIALOG = 1245; 
    protected Button someBtn; 
    protected AlertDialog diag; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     someBtn = (Button) findViewById(R.id.btn); 
     someBtn.setOnClickListener(this); 

    } 


    public void onClick(View view) { 
     if (view.getId() == R.id.btn) { 
      diag = createDialog(CREATE_CLOSE_DIALOG); 
      diag.show(); 
     } 
    } 

    private AlertDialog createDialog(int type) { 
     AlertDialog dialog = null; 
     switch (type) { 
     case CREATE_CLOSE_DIALOG: 
      dialog = new AlertDialog.Builder(TestActivity.this) 
       .setTitle("Closing") 
      .setMessage("Do you want to quit?") 
      .setPositiveButton("Yes", dialogListener) 
      .setNegativeButton("no", dialogListener) 
      .create(); 
      break; 
     } 
     return dialog; 
    } 


    final DialogInterface.OnClickListener dialogListener = new OnClickListener() { 
     public void onClick(DialogInterface dialog, int which) { 
      switch (which) { 
       case DialogInterface.BUTTON_POSITIVE: 
        dialog.dismiss(); 
        finish(); 
       break; 
       case DialogInterface.BUTTON_NEGATIVE: 
        dialog.dismiss(); 
       break; 
      } 
     } 
    }; 
} 

main.xml中

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:orientation="vertical" > 

    <Button 
     android:id="@+id/btn" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:text="Quit!" 
     android:layout_marginTop="20dp" 
     /> 

</LinearLayout> 
0

謝謝回答我的問題。實際上,我從非活動類調用Close(),因此調用runOnUiThread()。 我期待在調用activity.finish()之前,dialog.dismiss()將完成其工作。 無論如何,我會使用dialog.builder.create()並嘗試你的解決方案。

0

您需要解僱的onPause()onDestroy()方法

相關問題