前些阵子在搞一个app的时候,调用了AertDialog 来作为提示框,但是,总是出现window 窗口泄漏的异常
,后来,重新去看了一下源代码,再去查了一下资料,终于解决了这个问题。
原来, 每一个android的activity都有一个windowManager的窗口管理器,对应的每一个依附在activity上面的对话框,也有一个windowManager,如果,我在finish了activity的时候,没有对这些窗口进行处理,那么就会出现window leadked 这个异常。下面贴一下我写的一个说明程序。
下面这段程序是会发生window leaked异常的。
- 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);
- info.setTitle("提示框").setPositiveButton("确定", null).setMessage("窗口加载是异步的");;
- info.show(); //android 对话框的加载是异步的,所以即使屏幕上出现了一个 对话框,但是,它还是会继续去执行下面的finish()方法,导致窗口泄漏
- finish();
-
- }
-
-
-
- }
但是,如果我们稍加修改,就可以避免这样的问题出现。
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) |