最近在做一个libgdx的项目,遇到很多和android相关的技术问题,其中在android子项目中如何实现对话框提示信息就是一个,原以为很简单,就是构造一个Dialog,然后show出来,给个按钮关闭事件就可以了,没想到还是费了一番周折。
一、按照固有想法实现,出现问题。
将以下方法放到了项目业务逻辑判断方法中了,总之,没有放到onCreate方法之中。
AlertDialog.Builder builder = new AlertDialog.Builder(context);
builder.setTitle("提示");
builder.setMessage("微信客户端没有安装");
builder.setNegativeButton("确定", null);
builder.show();
出现问题:
08-07 10:44:04.850: E/AndroidRuntime(15528): java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
网上有解决办法说:
在上面的代码的前后加上
Looper.prepare();
......
Looper.loop();
对话框成功提示了一次,然后程序就崩溃退出了。
然后在网上查找原因和解决办法,自己在没有了解清楚android消息机制之前,想快速解决这个问题,就是百度、google一顿搜,然后贴上网友的代码一顿试,后来又看到Handle、主线程、子线程和sendMessage之类的介绍,感觉好像应该试试
二、加入Handle,重新梳理思路,接近成功。
在onCreate方法中定义Handle,将对话框提示代码抽象出来写成方法,在业务逻辑处用handle.sendMessage(1),向主线程发送消息,处理消息中显示对话框。
onCreate中的代码:
mHandler = new Handler() {
public void handleMessage(Message msg) {
switch (msg.what) {
case 1:
showDialog(getBaseContext());
}
};
};
对话框方法代码:
private void showDialog(Context context) {
AlertDialog.Builder builder = new AlertDialog.Builder(context);
builder.setTitle("提示");
builder.setMessage("微信客户端没有安装");
builder.setNegativeButton("确定", null);
builder.show();
}
业务逻辑处调用代码:
Message msg = new Message();
msg.what = 1;
mHandler.sendMessage(msg);
结果红色代码块那里报错了:
08-07 15:35:16.687: E/AndroidRuntime(5057): android.view.WindowManager$BadTokenException: Unable to add window -- token null is not for an application
有网友说:
必须使用Activity的Context对象
三、修改代码,成功显示。
将红色代码改成
MainActivity.this
注:该Activity就是你当前的要是对话框的Activity名称。
运行程序,成功显示对话框。