假设我们有两个按钮,每个按钮都有一个OnClickListener。每个监听器显示一个ProgressDialog并执行一些后台工作。(场景后面是一个AsyncTask,对话框在onPreExecute中打开。我认为这无关紧要,只是声明一下……)。假设有一些规则规定在任何给定时间不能有超过一个后台工作线程处于活动状态。
我的假设是,对话框防止两个后台工作在同一时间运行。我认为模态对话框阻塞了UI,并且在调用对话框的show()方法后不可能单击另一个按钮。我错了。
如果你点击按钮足够快,它有可能触发两个后台工作(几乎)在同一时间。日志显示,在150毫秒的时间跨度内点击两个按钮是可能的,尽管对话框:
<>之前04-14 18:34:04.390: DEBUG/greenrobot(1860):点击:213103411204-14 18:34:04.470: DEBUG/greenrobot(1860): doInBackground2: 213103411204-14 18:34:04.540: DEBUG/greenrobot(1860):点击:213103411304-14 18:34:04.570: DEBUG/greenrobot(1860): doInBackground2: 2131034113之前对话框代码看起来像这样:
progressDialog = new ProgressDialog(currentActivity);
progressDialog.setMessage(msg);
progressDialog.show();
我错过了什么?我希望我错过了一些愚蠢的东西,因为如果没有,我想不出一个好的解决方案来防止点击后的UI交互。同步后台工作线程不是一个解决方案,因为UI和场景更复杂。
单击按钮后禁用该按钮,直到再次单击安全为止。
show()
是异步的。对话框不会在呼叫show()
时立即出现。过一会儿就会生效。