在我的public class MediaButtonIntentReceiver extends BroadcastReceiver
的onReceive(Content context, Intent intent)
方法中,我需要計算ACTION_MEDIA_BUTTON
中由KeyEvent.ACTION_DOWN
表示的耳機按鈕單擊次數(單,雙,三)。計算BroadcastReceiver中的耳機按鈕單擊
我幾乎可以工作,但是我現在的算法很糟糕,幾次之後就不可靠了。基本上每個連續的ACTION_DOWN
(命中一定數量的毫秒到前面的ACTION_DOWN
)我做numClicks++
。但同時我也需要了解用戶何時完成按鍵,因此在每個事件之後,我都會啓動一個CountDownTimer
,如果到時候它沒有新的點擊,那麼我就完成了,現在知道了點擊次數。
我遇到的問題如下:一,按鈕本身似乎很嘈雜 - 如果我按它太快,我通常會錯過點擊。二,經過幾次試用,當它加載的應用程序,它開始變得隨機,我假設有多個CountDownTimer
線程(這是正確的詞?)仍然運行哪個螺絲我的東西了。
反正這裏的主要代碼片段:
//注:thisClickTime
使用System.currentTimeMillis()
if (action == KeyEvent.ACTION_UP) {
if (isDown == true) {
if (numClicks == 0 && lastClickTime == 0) {
//we have a new click
numClicks++;
lastClickTime = thisClickTime; //update the click time
isDown = false;
elapsedTime = thisClickTime - lastClickTime;
} else if (thisClickTime - lastClickTime < clickDelay) { //&& thisClickTime - lastClickTime > 10
numClicks++;
lastClickTime = thisClickTime;
isDown = false;
}
final int oldNumClicks = numClicks;
final CountDownTimer checkIfDone = new CountDownTimer(clickDelay, 10) {
public void onTick(long millisUntilFinished) {
if (oldNumClicks != numClicks) {
cancel();
}
}
public void onFinish() { //code that executes when counter is done
if (oldNumClicks == numClicks) {
//if user doesn't click anymore in time clickDelay + X milliseconds, then it's done
Toast.makeText(context, "Number of clicks: " + Integer.toString(numClicks), Toast.LENGTH_SHORT).show();
//reset state variables
numClicks = 0;
lastClickTime = 0;
}
}
}.start();
} else {
//?
}
}
僅供參考,我一直在尋找的東西周圍像:
查看是否有註冊點擊次數的好方法。儘管我不太瞭解他們的代碼,但從我所看到的他們只處理單/雙擊(我可能需要三倍和四倍)。
編輯 - 上傳了我正在使用的當前代碼。它在大多數時間都很體面。以下是我注意到的:如果我的按鈕測試時間太近,結果就開始搞砸了,並且正在計算點擊次數。我認爲這是因爲之前嘗試的其他CountDownTimers仍然是打開的,並且當它們完成時,它們會重置某些狀態變量(numClicks = 0,表示一個)。那麼我濫用計時器了嗎?我不能想到另一種解決方案,因爲我需要在最後一次點擊後經過一段時間才能確定點擊完成的時間。
感謝您的任何幫助。
你解決了這個問題嗎?如果是這樣,請分享代碼。 – azizbekian 2012-06-08 20:31:52
這是很久以前,但是我確實以某種方式解決了它。我所做的一般要點是使用彼此等待的線程來進行順序計數,只能聽一段時間。它是這樣工作的:在第一次點擊時,開始一個新的線程來監聽下一次點擊;增加全局點擊計數器。如果在TIME_PERIOD時間內沒有其他的點擊發生,退出線程並使用num_clicks = 1。否則,一旦新的點擊,產生一個新的線程來聆聽......我相信這不是一個好的解釋。我會在今晚/明天晚些時候查看我的代碼,並說出我做了什麼。但我確實解決了它! – JDS 2012-06-08 23:14:14
謝謝。不過,如果你分享其他用戶的代碼會很好,因爲我對android很陌生,無法很好地使用線程等。謝謝。 – azizbekian 2012-06-09 06:20:16