如何实现程序加载时弹出正在加载对话框
我们做的很多应用程序,很多功能都需要较长的加载时间,比如下载功能,转换页面等等。在程序进行后台处理的时候,前台的ui是没有反应的。如果在这段时间内我们不作任何处理就让程序停在那的话。第一,用户体验会很差。第二,如果用户在这段时间内不耐烦开始对界面猛点(我相信长时间程序没响应大家都会这么做),那么很可能使程序挂掉。所以我们需要在程序加载时弹出加载对话框,解决以上两个问题。
先给大家看一下效果图:
显示最新帖子界面:
点击最热按钮,跳转到显示最热帖子页面,在加载时弹出加载对话框:
加载完毕后,变成了最热页面:
好的,我们一步一步来,首先,那个加载对话框的实现其实是有一个类,叫做ProgressDialog,要显示对话框在程序中,只需用下面这段代码。
progressdialog=ProgressDialog.show(HTTPRequestActivity.this, "Loading...", "Please wait...",true,false);
这当中progressdialog是一个ProgressDialog的对象,show的参数依次为上下文,Dialog要显示的标题,Dialog显示的信息,第三个参数确定进度条是否为不确定,第四个确定是否可以被取消。至于你还想要设置它的其他属性,可以去查一下文档,里面有很多设置属性的函数,你可以通过这些函数把对话框改成你想要的样子。
然后我们要解决的一个问题就是如何在程序加载成功之后让对话框消失,显示新的页面内容。
代码如下:
Handler dialoghandle=new Handler(){
@Override
public void handleMessage(Message msg) {
// TODO Auto-generated method stub
super.handleMessage(msg);
progressdialog.dismiss();
}
};
首先定义一个Handler对象,重载其handlemessage方法,在这里面让ProgressDialog消失。
下面我以“最热”按钮为例,“最新”按钮和其基本一致。
hotest.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View v) {
// TODO Auto-generated method
newest.setClickable(true);
hotest.setClickable(false);
progressdialog=ProgressDialog.show(HTTPRequestActivity.this, "Loading...", "Please wait...",true,false);
seturl("http://www.bling0.com/all/hottest/day.json");
new Thread(){
public void run(){
CallWebService(geturl());
listadapter=new SimpleAdapter(HTTPRequestActivity.this,Hotlist ,R.layout.user,new String[]{"title","group","photo","username"},new int []{R.id.title,R.id.group,R.id.photo,R.id.username});
dialoghandle.post(new Runnable(){
public void run()
{
setListAdapter(listadapter);
dialoghandle.sendEmptyMessage(0);
}
});
}
}.start();
}
});
}
在点击按钮后,先让加载对话框出现。然后再调用handler对象的post方法向ui线程发送一个消息,里面有刷新列表和让对话框消失的操作,这样,程序一加载完毕,与此同时ui也会发生变化。