小弟今日学习Android,在把书上的例子抄进eclipse的运行的时候发现跳出这个错误,请问有没有人也碰到过呢:
04-12 08:56:49.387: ERROR/WindowManager(706): Activity org.example.sudoku.Sudoku has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView@43acacc0 that was originally added here
04-12 08:56:49.387: ERROR/WindowManager(706): android.view.WindowLeaked: Activity org.example.sudoku.Sudoku has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView@43acacc0 that was originally added here
04-12 08:56:49.387: ERROR/WindowManager(706):     at android.view.ViewRoot.<init>(ViewRoot.java:227)
04-12 08:56:49.387: ERROR/WindowManager(706):     at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:148)
04-12 08:56:49.387: ERROR/WindowManager(706):     at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:91)
04-12 08:56:49.387: ERROR/WindowManager(706):     at android.view.Window$LocalWindowManager.addView(Window.java:424)
04-12 08:56:49.387: ERROR/WindowManager(706):     at android.app.Dialog.show(Dialog.java:239)
04-12 08:56:49.387: ERROR/WindowManager(706):     at android.app.AlertDialog$Builder.show(AlertDialog.java:802)
04-12 08:56:49.387: ERROR/WindowManager(706):     at org.example.sudoku.Sudoku.openNewGameDialog(Sudoku.java:82)
04-12 08:56:49.387: ERROR/WindowManager(706):     at org.example.sudoku.Sudoku.onClick(Sudoku.java:44)
04-12 08:56:49.387: ERROR/WindowManager(706):     at android.view.View.performClick(View.java:2364)
04-12 08:56:49.387: ERROR/WindowManager(706):     at android.view.View.onTouchEvent(View.java:4179)
04-12 08:56:49.387: ERROR/WindowManager(706):     at android.widget.TextView.onTouchEvent(TextView.java:6532)
04-12 08:56:49.387: ERROR/WindowManager(706):     at android.view.View.dispatchTouchEvent(View.java:3709)
04-12 08:56:49.387: ERROR/WindowManager(706):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:882)
04-12 08:56:49.387: ERROR/WindowManager(706):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:882)
04-12 08:56:49.387: ERROR/WindowManager(706):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:882)
04-12 08:56:49.387: ERROR/WindowManager(706):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:882)
04-12 08:56:49.387: ERROR/WindowManager(706):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:882)
04-12 08:56:49.387: ERROR/WindowManager(706):     at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1659)
04-12 08:56:49.387: ERROR/WindowManager(706):     at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1107)
04-12 08:56:49.387: ERROR/WindowManager(706):     at android.app.Activity.dispatchTouchEvent(Activity.java:2061)
04-12 08:56:49.387: ERROR/WindowManager(706):     at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1643)
04-12 08:56:49.387: ERROR/WindowManager(706):     at android.view.ViewRoot.handleMessage(ViewRoot.java:1690)
04-12 08:56:49.387: ERROR/WindowManager(706):     at android.os.Handler.dispatchMessage(Handler.java:99)
04-12 08:56:49.387: ERROR/WindowManager(706):     at android.os.Looper.loop(Looper.java:123)
04-12 08:56:49.387: ERROR/WindowManager(706):     at android.app.ActivityThread.main(ActivityThread.java:4310)
04-12 08:56:49.387: ERROR/WindowManager(706):     at java.lang.reflect.Method.invokeNative(Native Method)
04-12 08:56:49.387: ERROR/WindowManager(706):     at java.lang.reflect.Method.invoke(Method.java:521)
04-12 08:56:49.387: ERROR/WindowManager(706):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860)
04-12 08:56:49.387: ERROR/WindowManager(706):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
04-12 08:56:49.387: ERROR/WindowManager(706):     at dalvik.system.NativeStart.main(Native Method)

解决方案 »

  1.   

    请贴代码,可能是你重复的添加某个对象,导致了memory leak发生太频繁了。
      

  2.   

    代码是:
    public class Sudoku extends Activity implements OnClickListener {

    private static final String TAG = "Suduku";

        /** Called when the activity is first created. */
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
            
            //set up click listeners for all the buttons
            View continueButton = this.findViewById(R.id.continue_button);
            continueButton.setOnClickListener(this);
            View newButton = this.findViewById(R.id.new_button);
            newButton.setOnClickListener(this);
            View aboutButton = this.findViewById(R.id.about_button);
            aboutButton.setOnClickListener(this);
            View exitButton = this.findViewById(R.id.exit_button);
            exitButton.setOnClickListener(this);
        }
        
        /** Called when click screen. */
    public void onClick(View v) {
    switch (v.getId()) {
    case R.id.about_button:
    Intent i = new Intent(this, About.class);
    startActivity(i);
    break;
    case R.id.new_button:
    openNewGameDialog();
    case R.id.exit_button:
    finish();
    break;
    }
    }

        /** Called when menu created. */
        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
         super.onCreateOptionsMenu(menu);
         MenuInflater inflater = getMenuInflater();
         inflater.inflate(R.menu.menu, menu);
         return true;
        }
        
        /** Called when menu click. */
        @Override
        public boolean onOptionsItemSelected(MenuItem item) {
         switch (item.getItemId()) {
         case R.id.settings:
         startActivity(new Intent(this, Settings.class));
         break;
         }
         return false;
        }
        
        /** open the game level to be select. */
        private void openNewGameDialog() {
         Log.d(TAG, "Show the select Dialog...");
         new AlertDialog.Builder(this)
         .setTitle(R.string.new_game_title)
         .setItems(R.array.difficuty, 
         new DialogInterface.OnClickListener() {
         public void onClick(DialogInterface dialoginterface, int i) {
         startGame(i);
         }
         })
         .show();
        }
        
        /** start the game. */
        private void startGame(int i) {
         Log.d(TAG, "Clicked on " + i);
        }
    }多选项用配置array.xml:<?xml version="1.0" encoding="utf-8"?>
    <resources>
    <array name="difficuty">
    <item>@string/easy_label</item>
    <item>@string/medium_label</item>
    <item>@string/hard_label</item>
    </array>
    </resources>值配置strings.xml        <string name="new_game_title">Difficulty</string>
    <string name="easy_label">Easy</string>
    <string name="medium_label">Medium</string>
    <string name="hard_label">Hard</string>
      

  3.   

    问题不在于添加太频繁了
    而在于变态的1.6(2.2没有这个问题)怎么弹出对话框
    因为activity在弹出对话框之前要调用onpause方法,而这个方法之后再show dialog就会leak
    有谁知道1.6怎么让activity弹出对话框吗?别说在onpause里关闭对话框,我就是需要这个对话框
      

  4.   

    在没有关闭对话框的时候你把activity给finish,所以造成了这样的结果
      

  5.   

    我也遇到这个问题了,把hide方法换成dismiss之后就没有问题了。不知道你们的行不。
      

  6.   

    楼上说的没错,case语句有问题,少个break。android的dialog创建的时候会传入一个参数this,就是你当前的activity,你的dialog必须在Activity销毁之前先释放掉,否则就会报windowleaked的错误。http://407827531.iteye.com/blog/1021603 这篇里面有讲到