Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/203.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Dialog.show()是非阻塞方法吗?_Java_Android - Fatal编程技术网

Java Dialog.show()是非阻塞方法吗?

Java Dialog.show()是非阻塞方法吗?,java,android,Java,Android,我有一个按钮,可以启动后台线程来做一些工作,我正在尝试使用ProgressDialog来防止用户在工作完成时双击该按钮(或任何其他ui元素)。我在按钮onClick代码中做的第一件事是显示进度对话框,它接管了屏幕。我看到的问题是,如果我快速点击此按钮,有时会在显示ProgressDialog之前注册两次或更多次按下。这导致我假设ProgressDialog.show()在ProgressDialog实际可见之前返回 有人能证实这一点吗?还有,有没有办法改变这种行为,或者至少得到对话框何时实际可见

我有一个按钮,可以启动后台线程来做一些工作,我正在尝试使用ProgressDialog来防止用户在工作完成时双击该按钮(或任何其他ui元素)。我在按钮onClick代码中做的第一件事是显示进度对话框,它接管了屏幕。我看到的问题是,如果我快速点击此按钮,有时会在显示ProgressDialog之前注册两次或更多次按下。这导致我假设ProgressDialog.show()在ProgressDialog实际可见之前返回

有人能证实这一点吗?还有,有没有办法改变这种行为,或者至少得到对话框何时实际可见的通知?我看到了Dialog.onStart(),但考虑到javadoc,这似乎是在对话框实际可见之前调用的

更新: 虽然一般来说似乎没有解决此问题的好方法,但以下方法适用于我的情况,即我的工作是通过外部线程完成的,并且要做的工作量比处理所有按钮单击所需的时间要长:

void myOnClickHandler() {
  if(myButton.isEnabled()) {
    myButton.setEnabled(False);
    // do work here
    // setEnabled(true) is invoked at the end of my spawned thread's run().
  }
}
没有


问题是,在传递单击事件之前,您单击了很多次。(也就是说,在运行
ProgressDialog.show()
)之前,它是排队的)

根据我在Android中注意到的情况,你可以快速双击按钮,让onClick监听器启动两次(甚至更多),而不管监听器中的代码是什么(即使你立即禁用按钮)


我不久前在这里报告了一个bug:当然,这些东西往往会被谷歌“忽略”。请随意启动它,希望能引起谷歌的注意

为什么你不在按钮上
setClickable(false)
,就在onClick内,在你完成进度之后
setClickable(true)
?我正试图保存它作为最后的手段。将“进度”对话框用作阻止机制实际上已内置于正在完成的工作中,如果可能的话,我希望能够重用该机制。@RafaelT&Jave-虽然听起来不错,但这实际上并不妨碍您多次单击按钮。如果你点击的速度足够快,在调用实际的偶数处理程序禁用按钮之前,你会发出多次点击。所以,它确实适用于大多数情况,因为大多数用户不会疯狂地点击按钮。。但是,您总是会遇到这样一个家伙……我认为一种可能的解决方法可能是将setEnabled(false)与将按钮的工作包装在if(button.isEnabled(){…}中相结合.@Nick-解决方案是将task/thread对象作为成员变量。如果在输入onClick处理程序时该对象为null,则使用同步块初始化该线程/异步任务并启动它。如果在输入onClick时该对象不为null,则表示您已开始运行线程,应返回从你的点击处理程序没有做任何事情。对我来说,这意味着setEnabled(false)也将不起作用?是否有任何方法可以防止这种情况,而不在检查点击时间戳的按钮处理程序代码中写入某种过滤器?这是第一个描述潜在问题的响应,因此被接受为答案。