2011-06-22 65 views
0

好吧..它不完全是播放列表,但它的想法很相似。我正在製作一本有聲讀物。而且音頻數據非常龐大(每本書可以達到90 MB),所以我不想將所有這些內容加載到內存中,因爲我知道這些設備具有內存限制。需要爲Android應用程序製作某種播放列表

所以不是我想要得到一批語句(是的,音頻數據被分割成句子並以blob的形式存儲在本地sqlite數據庫中),可以說10或20並將它們放入一個字節數組中,將這10或20個字節數組中的每一個保存到一個臨時文件中(每次一個,就像這裏解釋的單個字節數組Android - Playing mp3 from byte[]),然後將該文件提供給MediaPlayer。

問題是我需要等待一個句子結束下一個開始,所以我不重疊的聲音。爲此我創建了包含MeadiaReader的類來實現OnCompletionListener。所以無論何時句子結束,都會調用onCompletion方法。這種方法開始另一行,最後調用onCopletion,這樣就結束了。

最後它的工作原理,但它有種遞歸,我不喜歡它被結構化的方式。我怎樣才能更好地在應用中實現這種功能?

---------------------------------------編輯------ --------------------------------

那麼,這裏有一些澄清的代碼。我剛剛得到了這個返回這個堆棧跟蹤的NullPointerException:

06-22 12:16:09.152: ERROR/AndroidRuntime(1163): java.lang.NullPointerException 
06-22 12:16:09.152: ERROR/AndroidRuntime(1163):  at com.spiral.android.IslamicAudioBook.SentencesReader.onCompletion(SentencesReader.java:163) 
06-22 12:16:09.152: ERROR/AndroidRuntime(1163):  at com.spiral.android.IslamicAudioBook.SentencesReader.playMp3(SentencesReader.java:123) 
06-22 12:16:09.152: ERROR/AndroidRuntime(1163):  at com.spiral.android.IslamicAudioBook.SentencesReader.onCompletion(SentencesReader.java:163) 
06-22 12:16:09.152: ERROR/AndroidRuntime(1163):  at com.spiral.android.IslamicAudioBook.SentencesReader.playMp3(SentencesReader.java:123) 

....(繼續像這樣的另外10行左右)。 異常本身很容易理解,它只是指出函數調用正在遞歸的事實。了playMP3方法是非常相似的,從我上方通過的鏈接之一,onCompletion有點像這樣:

@Override 
public void onCompletion(MediaPlayer mediaPlayer) { 
    if(batchSize*batchIndex + sentenceIndex > totalNumberOfSentences){ 
     return; 
    } 
    if(batchOfSounds == null){ 
     return;   
    } 
    if(sentenceIndex == this.batchSize - 1){ 
     Log.d(TAG,"All sentences from batch read, getting next batch"); 
     this.batchOfSounds = this.getBatchOfSoundsFromDatabase(batchIndex); 
    }else{ 
     Log.d(TAG,"Playing sentence index: "+sentenceIndex);    
    } 
    this.playMp3(batchOfSounds[sentenceIndex],0); 
} 

正如你可以很容易地看到引發異常,只是因爲我默默地檢查batchOfSounds(這是一個byte [ ] [])在方法getBatchOfSoundsFromDatabase返回新的引用之前爲空,所以不要介意,我會解決它。

但是,然後這2種方法互相調用,事情顯然會遞歸嗎?我想這不是很好......對不對?或者是否可以接受,如果我只是不在這兩種方法中創建新的引用?將這個問題稍微延伸一點,何時可以接受遞歸方法?現在來思考它,我相信如果沒有創建新的實例變量,它可能是可以接受的。我對嗎?

+0

我一直以爲音頻書會放在一個文件中,不是嗎?如果是的話,你不能只將整個文件的路徑給予mediaplayer嗎? – bluefalcon

回答

0

你擁有它的方式聽起來很合理,雖然我不是100%確定我知道你的意思是沒有一點代碼或僞代碼。不過,如果你不喜歡它的結構如何,你可以有一個包裝媒體播放器的類,它可以維護一系列的內容。它仍然監聽onCompletion,這只是將下一個項目從隊列中取出並播放它。您可以保留一個單獨的「加載器」類,它填充onCompletion隊列。通過這種方式,您可以分離關注點,讓玩家關注玩遊戲,以及只需加載的加載器類。

相關問題