2011-12-07 25 views
1

正如問題所述,這裏是代碼。Android線程在進程中間隨機停止

我想要做的事情基本上是我有一個數組列表,說「myArray」。該數組包含以毫秒爲單位的存儲時間點。接下來的事情是我想調用基於這些時間點的方法。因此,我需要在播放音樂時從0開始計時,並逐個比較時間計數器與數組中的時間點(從第一個數組索引到結束)。

第一種方法「timeCounter」是一種通過MediaPlayer播放音樂時啓動時間計數器的方法。

public void timeCounter(){ 
    Runnable myRunnable = new Runnable(){ 
     @Override 
     public void run(){ 
      while(musicPlaying){ 
       startCounter(arrayPos); 
      } 
     } 
    }; 
    Thread musicPlayer = new Thread(myRunnable); 
    musicPlayer.start(); 
} 

這是數組中時間計數器和時間比較發生的地方。

public void startCounter(List<Long> array){ 
    elapsedTime = System.currentTimeMillis() - timeStart; 
    if(elapsedTime == array.get(arrayPos)){ 
     arrayPos += 1; //Continue comparing with the next number in the array 
     Log.v("DEBUG", "TIME MATCHES!"); 
     if(arrayPos>= array.size()){ 
      arrayPos= 0; //Prevent out of array index 
     } 
    } 
} 

我的代碼正常運行,LogCat的結果是正確的。

現在的問題是,線程直到音樂播放完畢纔會運行(當音樂播放完成後,我設置了onCompletionListener並將「musicPlaying」設置爲false)。停車點完全是隨機的,有時候剛開始的時候,或者是50%左右,或者即將完成。有時它甚至沒有開始! 我一直在努力弄清楚爲什麼,但我找不到任何關於線程中途停止或任何地方的任何信息。提前致謝! =)

+0

當線程完成「musicPlaying」變量的狀態時,您可能會記錄一條消息。我敢打賭,@Tudor已經出現,並且'musicPlaying'正在線程之間隨機更新。 – Gray

+0

等待,如果即使退出應用程序時,我放入線程中的日誌消息仍然顯示消息,這意味着'musicPlaying'在整個過程中仍然是正確的,對嗎? –

+0

@Gray我應該在哪裏登錄郵件?將日誌放入循環器中充斥我的logcat,並且線程繼續運行,即使退出應用程序時也顯示「true」,即使當我退出應用程序時 –

回答

1

我懷疑你的if(elapsedTime == array.get(arrayPos))應該是if(elapsedTime >= array.get(arrayPos))

您需要記住毫秒計時器不一定有一毫秒的時間間隔。例如,在Windows上,返回的值只會每15毫秒左右更改一次。因此,您可能完全錯過了特定的時間,因此絕對不會在您的列表中超過該條目。

+0

哦,可能是這種情況。好吧,讓我跑一些測試,稍後會通知你 –

+0

現貨!我想'=='對於一個計數器來說是不好的做法。非常感謝! =) –

2

如果在線程之間修改並讀取musicPlaying,請確保它聲明爲volatile

+0

我已將'musicPlaying'聲明爲'volatile',但問題仍然存在。 –

+0

感謝提醒我使用'volatile',如果我不使用它,可能會有另一個錯誤。 –