我有一個多線程應用程序,其中主線程啓動兩個線程:的Android隨機的MediaPlayer播放跳過一些文件
- makeRequest的螺紋
- QueueListener螺紋
makeRequest的線程每秒查詢後局域網上的打印機來請求一些數據並對其執行一些計算並將其饋送到第二線程正在偵聽的隊列。只要隊列中的數據可用,QueueListener線程就會從Queue中取出一條記錄,並啓動另一個線程,即MediaPlayer線程,此線程負責根據接收的字符串播放7到8個文件。我正在使用下面的代碼。
MediaPlayer mp = MediaPlayer.create(context, Uri.fromFile(new File(q[voiceIndex])));
mp.setOnCompletionListener(mCompletionListener);
mp.setOnErrorListener(mErrorListener);
mp.start();
這個代碼是在PlayMedia()方法,並在OnCompletionListener,我有以下代碼:
OnCompletionListener mCompletionListener = new OnCompletionListener() {
public void onCompletion(MediaPlayer mp) {
//will be called when media player finished playing a file.
mp.release();
StartPlayingNextFile();
}
};
private void StartPlayingNextFile() {
voiceIndex++;
if (voiceIndex < q.length){
PlayMedia();
}else{
finishedPlaying = true;
}
}
當QueueListener線程啓動MediaPlayer的主題我已經用加入()上線的MediaPlayer爲了不讓隊列中的另一個字符串出隊,並等待MediaPlayer完成其業務,否則我會聽到疊加的聲音。
現在,大多數時候一切似乎工作正常,但MediaPlayer的某個時候跳過玩一些文件,從而MediaPlayer的線程永遠不會終止,因爲OnCompletionListener從不叫和OnErrorListener永遠不會被稱爲要麼,因爲它的加入()永遠不會釋放,所以我已經明確地做後的合理時間已經過去:從logcat的
@Override
public void run() {
//record the start time
timeStart = new Date().getTime();
PlayMedia();
while (!finishedPlaying){
try {
//if a reasonable time has passed break the loop
long currentTime = (new Date().getTime() - timeStart);
long elapsedSeconds = TimeUnit.MILLISECONDS.toSeconds(currentTime);
if (elapsedSeconds > 15){
break;
}
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
日誌可以看到蜜蜂在那裏here 5個文件已被跳過2號線和27號線2之間即
: 1月1日至21日:20:18.474:V/MediaPlayerService(3240):從PID 15063,網址創建新的客戶端(1854)= /mnt/sdcard/voicedata/200.wav,CONNID = 1854
第27行: 01-21 01:20:30.504:V/MediaPlayerService(3240):從pid 15063創建新客戶端(1855),url = /mnt/sdcard/voicedata/constants/bell.wav,connId =已跳過1855個
文件是:
/mnt/sdcard/voicedata/a.wav
/mnt/sdcard/voicedata/b.wav
/mnt/sdcard/voicedata/c.wav
/mnt/sdcard/voicedata/d.wav
的/ mnt/SD卡/voicedata/e.wav
and bell.wav是第一個在所有這些文件之前播放的文件。