关于ProgressDialog不被dismiss的问题

当在Android中使用ProgressDialog时,有时会出现dialog.show()后无法被dismiss()关闭的情况,导致卡死。问题源于dismiss()操作在dialog未显示时会直接无效,如果线程中的事件顺序导致dismiss()先于show()执行,就会引发此问题。解决关键在于理解show()和dismiss()的消息传递机制及线程同步。
摘要由CSDN通过智能技术生成

ProgressDialog

问题复现

/*
*    一个按钮的Listener中
*/
startTask(singleTask);//发送IO请求

//跳出一个ProgressDialog
if(blockDialog==null){
    blockDialog = new ProgressDialog(this);
}
blockDialog.setMessage(string);
blockDialog.setCancelable(false);
blockDialog.show();


/*
*    响应放在onEventMainThread中
*/
public void onEventMainThread(CmdEvent event) {
    if(seqnum==event.seqNum){
        blockDialog.dismiss();
    }
}

发现有极小情况下dialog.show()之后无法被dismiss掉,会卡死。
百思不得其解。

错误分析

如果show()和dismiss()操作均是发送消息给UI线程,在UI线程中操作,那么流程会是如下:

UI线程

  1. onClick()

    • startUITask //收到event,产生2操作
    • progressDialog.show()//发送showMessage,即3操作
  2. onEventMainThread(Event event)

    • progressDialog.dismiss()//发送dismissMessage࿰
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值