Android AlertDialog弹出后不等待输入直接执行清除逻辑问题
问题根因
Android的AlertDialog为异步非阻塞组件,调用.show()方法后不会阻塞代码执行等待用户操作,后续逻辑会立刻运行。
当前代码存在两处直接引发故障的问题:
- 清空数据库、关闭页面的逻辑直接写在弹窗
.show()方法之后,弹窗刚完成渲染,就被后续执行的finish()方法关闭,清空操作也同步执行完成,因此弹窗只会短暂闪现 - 预先定义的
dialogClickListener中没有编写任何实际业务逻辑,即使用户等待弹窗加载完成点击按钮,也不会触发对应操作
修复代码
只需要调整update()方法的逻辑,把清空操作、页面关闭逻辑全部移到确认按钮的点击回调里,取消按钮仅关闭弹窗即可,同时移除try块最外层统一调用的finish(),改为操作完成后再触发页面关闭,修正后的方法代码如下:
// PYT Button TEMPS as a toggle - Set/Clear DateTime for this racer private void update(){ try{ SimpleDateFormat time_format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.getDefault()); String current_time = time_format.format(new Date(System.currentTimeMillis())); String old_time = model.getTempsPassage(); String statut = model.getStatut(); if(statut.equals("En_Course")){ if (old_time != null && !old_time.equals("")) { // 弹出确认弹窗 AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setMessage("确定要清空该选手的通过时间吗?") .setPositiveButton("确定", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { // 用户点确认才执行清空逻辑 my_db = new DBHelper(UpdateView.this); my_db.updateCoureurs(model.getDossard(), null); showMessage("Temps de passage EFFACÉ pour ce coureur"); // 操作完成再关闭页面 finish(); } }) .setNegativeButton("取消", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { // 用户点取消,仅关闭弹窗不做任何操作 dialog.dismiss(); } }) .setCancelable(false) // 可选:禁止点击弹窗外部/按返回键关闭,避免误跳过确认 .show(); }else{ // 首次点击保存时间,不需要弹窗,直接执行 my_db = new DBHelper(this); my_db.updateCoureurs(model.getDossard(), current_time); finish(); } } else { finish(); } }catch (Exception e){ e.printStackTrace(); showMessage(getString(R.string.fail_update)); } }
额外说明
- 构建AlertDialog时传入当前Activity实例
this即可,不需要额外使用全局context变量,避免上下文引用错误导致弹窗无法正常挂载 - 如果后续需要给
update_dnf()的清空操作也加确认弹窗,逻辑完全一致:所有需要用户确认后才执行的业务逻辑,全部放到对应按钮的onClick回调中即可,不要写在.show()方法的后续代码行里
内容的提问来源于stack exchange,提问作者Pierre Tremblay
相关产品推荐
相关产品推荐

