2011-06-22 10 views
0

まあまあプレイリストではありませんが、アイデアは似ています。私はオーディオブックを作っています。また、オーディオデータは膨大で(書籍1本あたり90 MBになる可能性があります)、これらのデバイスに備わ​​っているメモリの制限を認識しているため、メモリにすべてロードする必要はありません。アンドロイドアプリの再生リストを作成する必要があります

その代わりに私は文のバッチを取得することを考えました(はい、音声データは文で分割され、BLOBとしてローカルsqliteデータベースに格納されています)、10または20としてバイト配列に入れて、それらの10または20バイトの配列のそれぞれを一時ファイルに保存し(1つの単一バイト配列Android - Playing mp3 from byte[]についてここで説明するように、それぞれ一度に1つずつ)、そのファイルをMediaPlayerに与えます。

問題は、次の音符が始まるまで1つの文章が終了するのを待つ必要があるため、音を重ならないようにすることです。そのために、OnCompletionListenerを実装するMeadiaReaderを含むクラスを作成しました。したがって、文が終わるたびに、onCompletionメソッドが呼び出されます。このメソッドは、別の行を開始し、最後にonCopletionを呼び出します。

最終的には動作しますが、再帰的なものになり、アーキテクチャが完成した方法が嫌いです。どのように私はアプリでこの種の機能をよりよく実装することができますか?

--------------------------------------- EDIT ------ --------------------------------

これは説明のためのコードです。私はちょうどこのスタックトレースを返したこの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方法は、私は上記渡されたリンクから1と非常に類似しており、onCompletionは多少このようなものです:あなたは簡単に私がdumblyバイトであるbatchOfSoundsを([チェックという理由だけ例外が発生見ることができるように

@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); 
} 

] []])を使用して、getBatchOfSoundsFromDatabaseメソッドが新しい参照を返す前にnullになっているので気にしないでください。

しかし、この2つのメソッドは、お互いを呼び出すと事は明確に再帰的に行くのですか?そして、それはまったくうまくいかないと思います..そうですか?両方のメソッドで新しい参照を作成していないのであれば容認できますか?この疑問をもう少し引き伸ばすと、再帰的な方法を持つことはいつ受け入れられますか?それについて考えるようになりました。新しいインスタンス変数が作成されなければ、それは受け入れられるかもしれないと私は信じています。私は正しい?

+0

私はいつもオーディオブックは1つのファイルにあると思っていましたが、そうではありませんか?そうであれば、ファイル全体のパスをmediaplayerに渡すことはできませんか? – bluefalcon

答えて

0

ちょっとしたコードや擬似コードなしで私が何を意味しているかを100%確信しているわけではありません。それでも、もしあなたがどのように構造化されているのが気に入らなければ、これについては:再生するための待ち行列を維持するメディアプレーヤーをラップするクラスを持つことができます。これはまだonCompletionを待ち受けますが、これはキューから次のアイテムを取得して再生します。あなたはキューを完成させるクラスの別の "ローダー"ソートを保持することができます。このようにして、懸念を分けることができ、プレイヤーの関心を維持し、ローディングのみのローダークラスにすることができます。

関連する問題