2012-05-22 71 views
0

我有一個按鈕,揭開序幕後臺線程做了一些工作,我試圖用一個ProgressDialog,以防止雙擊該按鈕(或任何其他UI元素),而正在開展工作的用戶。我在按鈕上點擊代碼的第一件事就是顯示進度對話框,它接管了屏幕。我看到的問題是,如果我快速點擊此按鈕,有時會在顯示ProgressDialog之前註冊兩個或更多個印刷機。這導致我假定ProgressDialog.show()在ProgressDialog實際可見之前返回。Dialog.show()是一種非阻塞方法嗎?

任何人能證實這一點?另外,有沒有辦法改變這種行爲,或至少得到對話的實際可見時間的通知?我看到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(). 
    } 
} 
+1

你爲什麼不'setClickable在您的按鈕(假)',只是裏面的onClick和你完成進度'setClickable(真)後再次'? –

+0

或'setEnabled(false)' – Jave

+0

我試圖將其作爲最後的手段進行保存。進度對話框作爲阻止機制的使用實際上是內置於正在完成的工作中,如果可能的話,我希望能夠重用該機制。 – Nick

回答

1

問題是您在點擊事件發佈之前多次單擊。 (即在你運行ProgressDialog.show()之前排隊)。

+0

對我來說這意味着setEnabled(false)也不起作用嗎?有沒有什麼辦法可以防止這種情況,而不必在檢查點擊時間戳的按鈕處理程序代碼中編寫某種過濾器? – Nick

+0

被接受爲答案,因爲這是表徵潛在問題的第一反應。 – Nick

1

從我注意到在Android中你可以快速雙擊一個按鈕,並讓onClick偵聽器觸發兩次(甚至更多),而不管偵聽器中的代碼如何(即使您立即禁用按鈕)。

我報了一個bug前一陣子在這裏:http://code.google.com/p/android/issues/detail?id=20073但當然,這些東西往往由谷歌去「被忽視」。隨意加上星在獲得谷歌的注意,希望