Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1146305
  • 博文数量: 103
  • 博客积分: 1897
  • 博客等级: 上尉
  • 技术积分: 1717
  • 用 户 组: 普通用户
  • 注册时间: 2012-04-19 21:02
文章分类

全部博文(103)

文章存档

2013年(19)

2012年(84)

分类: 嵌入式

2012-05-19 10:48:52


  前些阵子在搞一个app的时候,调用了AertDialog 来作为提示框,但是,总是出现window 窗口泄漏的异常,后来,重新去看了一下源代码,再去查了一下资料,终于解决了这个问题。
 原来,  每一个android的activity都有一个windowManager的窗口管理器,对应的每一个依附在activity上面的对话框,也有一个windowManager,如果,我在finish了activity的时候,没有对这些窗口进行处理,那么就会出现window leadked 这个异常。下面贴一下我写的一个说明程序。
下面这段程序是会发生window leaked异常的。


点击(此处)折叠或打开

  1. package com.lwq;
  2.     import android.app.Activity;
  3.     import android.app.AlertDialog;
  4.     import android.app.AlertDialog.Builder;
  5.     import android.content.DialogInterface;
  6.     import android.content.DialogInterface.OnClickListener;
  7.     import android.os.Bundle;
  8.     public class AndroidPracticeActivity extends Activity {
  9.         /** Called when the activity is first created. */
  10.         @Override
  11.         public void onCreate(Bundle savedInstanceState) {
  12.             super.onCreate(savedInstanceState);
  13.             setContentView(R.layout.main);
  14.             //弹出一个窗口
  15.            AlertDialog.Builder info = new Builder(this);
  16.            info.setTitle("提示框").setPositiveButton("确定", null).setMessage("窗口加载是异步的");;
  17.             info.show(); //android 对话框的加载是异步的,所以即使屏幕上出现了一个 对话框,但是,它还是会继续去执行下面的finish()方法,导致窗口泄漏
  18.             finish();
  19.           
  20.         }
  21.        
  22.         
  23.         
  24.     }

但是,如果我们稍加修改,就可以避免这样的问题出现。
package com.lwq;

import android.app.Activity;

import android.app.AlertDialog;
import android.app.AlertDialog.Builder;
import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;

import android.os.Bundle;

public class AndroidPracticeActivity extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        //弹出一个窗口
       AlertDialog.Builder info = new Builder(this);
//通过将finish方法写在窗口的响应函数中,将activity和对话框捆绑在一起,可解决这样问题。
// 另外
       info.setTitle("提示框").setPositiveButton("确定", new OnClickListener(){

        @Override
        public void onClick(DialogInterface dialog, int which) {
            // TODO Auto-generated method stub
              dialog.dimiss();//结束对话
            finish();
        }
          
       }).setMessage("窗口加载是异步的");
 
     
    }
  
   
   
}


阅读(10773) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~