2011-06-10 56 views
1

在我的public class MediaButtonIntentReceiver extends BroadcastReceiveronReceive(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 { 
      //? 
     } 
    } 

僅供參考,我一直在尋找的東西周圍像:

http://musicqueueproject.googlecode.com/svn-history/r83/trunk/src/com/yannickstucki/android/musicqueue/old/PlayerService.java

查看是否有註冊點擊次數的好方法。儘管我不太瞭解他們的代碼,但從我所看到的他們只處理單/雙擊(我可能需要三倍和四倍)。

編輯 - 上傳了我正在使用的當前代碼。它在大多數時間都很體面。以下是我注意到的:如果我的按鈕測試時間太近,結果就開始搞砸了,並且正在計算點擊次數。我認爲這是因爲之前嘗試的其他CountDownTimers仍然是打開的,並且當它們完成時,它們會重置某些狀態變量(numClicks = 0,表示一個)。那麼我濫用計時器了嗎?我不能想到另一種解決方案,因爲我需要在最後一次點擊後經過一段時間才能確定點擊完成的時間。

感謝您的任何幫助。

+0

你解決了這個問題嗎?如果是這樣,請分享代碼。 – azizbekian 2012-06-08 20:31:52

+1

這是很久以前,但是我確實以某種方式解決了它。我所做的一般要點是使用彼此等待的線程來進行順序計數,只能聽一段時間。它是這樣工作的:在第一次點擊時,開始一個新的線程來監聽下一次點擊;增加全局點擊計數器。如果在TIME_PERIOD時間內沒有其他的點擊發生,退出線程並使用num_clicks = 1。否則,一旦新的點擊,產生一個新的線程來聆聽......我相信這不是一個好的解釋。我會在今晚/明天晚些時候查看我的代碼,並說出我做了什麼。但我確實解決了它! – JDS 2012-06-08 23:14:14

+0

謝謝。不過,如果你分享其他用戶的代碼會很好,因爲我對android很陌生,無法很好地使用線程等。謝謝。 – azizbekian 2012-06-09 06:20:16

回答

1

如果您的BroadcastReceiver已在清單中註冊,則BroadcastReceiver將僅存在於對onReceive()的單次調用 - 後續廣播可能導致另一個BroadcastReceiver實例。清單註冊的BroadcastReceiver無法分叉線程,因爲一旦onReceive()結束,整個過程可能會關閉。

我很懷疑,有一個乾淨的方法讓您的代碼可靠,因爲媒體按鈕並非針對您的預期使用模式而設計的。

+0

好吧我在這裏非常靈活 - 我只需要一個可靠的方法來確定有多少耳機按鈕點擊某人。 broadcastreceiver是在Java代碼中使用IntentFilter(在我的mainActivity.java中)註冊的,而MediaButtonIntentReceiver類是它自己的文件(.java)。現在,如果我在嘗試更多點擊之前等待上一次敬酒剛剛完成,那麼計數工作就會相當可靠。 所以我認爲發生的事情是CountDownTimer讓我困惑,因爲多個定時器開始,當他們完成他們重置我的狀態變量(numClicks = 0等)。 – JDS 2011-06-10 18:55:43

+0

@ user624869:如果'MediaButtonIntentReceiver'正在被一個'Activity'註冊,我會使用'postDelayed()'來爲你的「再次喚醒」一點邏輯。這個'Runnable'和'onReceive()'都在主應用程序線程上處理,所以你不必擔心線程的安全性。 – CommonsWare 2011-06-10 19:06:30