为什么android中在dialog中调用progressDialog不用如方法同时加载

//自定义dialogpublicvoiddialog2(){dialog=newAlertDialog.Builder(this).setIcon(R.drawable... // 自定义dialog public void dialog2() {
dialog = new AlertDialog.Builder(this)
.setIcon(R.drawable.ic_launcher).setTitle("导入联系人")
.setMessage("是否导入联系人?")

.setPositiveButton("导入手机中联系人", new OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
//progressDialog = ProgressDialog.show(daoru.this, "Loading...", "Please wait...");

initProgressDialog();

}

}).setNegativeButton("导入Sim卡中联系人", new OnClickListener() {

public void onClick(DialogInterface arg0, int arg1) {
arg0.cancel();
// TODO Auto-generated method stub
try {
//sim卡中获取;
GetSimContact();

} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

}).create();

dialog.show();

}
private void initProgressDialog() {

progressDialog = new ProgressDialog(this);
progressDialog.setMessage("加载中....");
progressDialog.show();
mHandler.postDelayed(runnable, 200);

}

private Runnable runnable = new Runnable() {
public void run() {

try {
getContact();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

mHandler.sendEmptyMessage(1);
}
};
private Handler mHandler = new Handler() {
public void handleMessage(Message msg) {
switch (msg.what) {
case 1:
if (progressDialog != null)
progressDialog.dismiss();
break;
}
}
};
展开
 我来答
419595077
2012-10-23
知道答主
回答量:9
采纳率:0%
帮助的人:3.8万
展开全部
private void initProgressDialog() {

progressDialog = new ProgressDialog(this);
progressDialog.setMessage("加载中....");
progressDialog.show();
mHandler.postDelayed(runnable, 200);
}

这个方法本身有问题,android系统有一个主线程叫UI主线程,任何在UI主线程上进行较长时间得数据的交互都会导致UI线程堵塞,即有图像卡顿的现象。
mHandler.postDelayed(runnable, 200);这句话就是指在200毫秒后进行runnable的run方法,而这个方法会在UI主线程上进行,progressDialog转圈还没来得及显示就被这方法给堵塞了,所以会出现你的说那种状况。
解决方法有几种,可以用异步机制,或者消息机制(就好像你这种)。
用消息机制的话 ,mHandler.postDelayed(runnable, 200);这句话就不能要,改为:
Thread t = new Thread(runnable);
t.start();
异步机制就自己上网搜搜吧。
tanwei4199
2012-10-18 · TA获得超过397个赞
知道小有建树答主
回答量:943
采纳率:0%
帮助的人:493万
展开全部
你想说啥?
//progressDialog = ProgressDialog.show(daoru.this, "Loading...", "Please wait...");
initProgressDialog();
这两句不用同时用?
如果是问这个,那答案很简单了,因为两者是一样的,没必要重复,都是显示一个提示框,然后开启线程加载联系人
追问
调用
initProgressDialog(); 时我想让这个方法里的
private void initProgressDialog() {

progressDialog = new ProgressDialog(this);
progressDialog.setMessage("加载中....");
progressDialog.show();
mHandler.postDelayed(runnable, 200);

}

progressDialog转圈在调用getContact();方法,现在是这个方法getContact();执行完后才显示转圈的,他俩没同步
追答
你把handler里面的内容写到try catch的finally语句里面,这样不管
getContact();的结果如何都会执行dismiss。
你说的先执行 getContact();我也不好解释,因为就程序逻辑来看是木有问题的,我有个类似的demo,直接将线程写在onclick方法里面了,大概是这样的,你再试试。
.setPositiveButton("导入手机中联系人", new OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
//progressDialog = ProgressDialog.show(daoru.this, "Loading...", "Please wait...");

new Thread(){
public void run()
{
try
{
getContact();
}
catch(Exception e)
{
e.printStackTrace();
}
finally
{
m_dialog.dismiss();

}
}
}.start();
}
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
投机士
推荐于2016-04-02 · TA获得超过10.5万个赞
知道大有可为答主
回答量:2.5万
采纳率:0%
帮助的人:3971万
展开全部
// 方式一:new Dialog
final ProgressDialog dialog = new ProgressDialog(this);
dialog.show();

// 方式二:使用静态方式创建并显示,这种进度条只能是圆形条,设置title和Message提示内容
ProgressDialog dialog2 = ProgressDialog.show(this, "提示", "正在登陆中");

// 方式三 使用静态方式创建并显示,这种进度条只能是圆形条,这里最后一个参数boolean indeterminate设置是否是不明确的状态
ProgressDialog dialog3 = ProgressDialog
.show(this, "提示", "正在登陆中", false);

// 方式四 使用静态方式创建并显示,这种进度条只能是圆形条,这里最后一个参数boolean cancelable 设置是否进度条是可以取消的
ProgressDialog dialog4 = ProgressDialog.show(this, "提示", "正在登陆中",
false, true);

// 方式五 使用静态方式创建并显示,这种进度条只能是圆形条,这里最后一个参数 DialogInterface.OnCancelListener
// cancelListener用于监听进度条被取消
ProgressDialog dialog5 = ProgressDialog.show(this, "提示", "正在登陆中", true,
true, cancelListener);
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式