2012-05-22 2 views
0

일부 작업을 수행하기 위해 백그라운드 스레드를 시작하는 버튼이 있는데 ProgressDialog를 사용하여 사용자가 해당 버튼 (또는 다른 UI 요소)을 두 번 클릭하지 못하게하려고합니다. 내 버튼 onClick 코드에서 제일 먼저하는 일은 화면을 차지하는 진행 대화 상자를 표시하는 것입니다. 지금보고있는 문제는이 버튼을 빠르게 누르면 ProgressDialog가 표시되기 전에 두 개 이상의 프레스가 등록되는 경우가 있다는 것입니다. 이것은 ProgressDialog가 실제로 보이기 전에 ProgressDialog.show()가 돌아오고 있다고 가정합니다.Dialog.show()는 비 블로킹 방법입니까?

누구든지 확인할 수 있습니까? 또한,이 동작을 변경하는 방법이 있습니까? 아니면 적어도 대화 상자가 실제로 표시되는지 알려주는 방법이 있습니까? Dialog.onStart()를 보았지만 javadoc이 주어지면 Dialog가 실제로 표시되기 전에 호출 된 것처럼 보입니다 ...

업데이트 : 일반적으로이 문제를 해결할 좋은 방법이없는 것 같지만 내 작업이 수행하는 외부 스레드 작업의 양에 의해 이루어집니다 내 상황은 모든 버튼 걸리는 시간보다 더 오래 걸립니다에 대한 작품을 다음 것은 처리 할 수 ​​클릭 :

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

버튼에'onClickable (false)'를 지정하지 않은 이유는 무엇입니까? onClick 내에서 진행하고 나서 'setClickable (true)'진행을 다시 완료 한 이유는 무엇입니까? –

+0

또는'setEnabled (false)' – Jave

+0

나는 그것을 최후의 수단으로 저장하려고합니다. 진행중인 대화 상자를 차단 메커니즘으로 사용하는 것은 실제로 수행중인 작업에 포함되어 있으며 가능한 경우 해당 메커니즘을 다시 사용할 수 있기를 바랍니다. – Nick

답변

1

번호

문제는 click 이벤트가 전달되기 전에 여러 번 클릭 한 것입니다. (예 : ProgressDialog.show()을 실행하기 전에 대기열에 놓입니다.)

+0

나에게 이것은 setEnabled (false)가 작동하지 않음을 의미합니까? 클릭 타임 스탬프를 확인하는 버튼 처리기 코드에 일종의 필터를 쓰지 않고도 이러한 상황을 방지 할 수있는 방법이 있습니까? – Nick

+0

은 기본 문제를 특성화하기위한 첫 번째 응답 이었기 때문에 대답으로 받아 들였습니다. – Nick

1

Android에서 알아 챘을 때 버튼을 빠르게 두 번 클릭하고 리스너의 코드에 관계없이 onClick 리스너를 두 번 (또는 그 이상) 실행할 수 있습니다 (버튼을 즉시 비활성화하더라도).

나는 잠시 전에 여기에 버그를보고했습니다 : http://code.google.com/p/android/issues/detail?id=20073하지만 물론 이러한 것들은 Google에서 눈에 띄지 않는 경향이 있습니다. Google의 관심을 끌기 위해 별표를 표시해주세요.

관련 문제