2011-03-03 12 views
1

音楽ストリーミングアプリを作成しようとしています。 これまでのところうまく動作します。 私は無限のストリームを準備するためにTextViewはボタン内から描画しません。

​​

便利なメソッドを使用しています(24時間365日のmp3ストリーム)。 私はstartPlaying()メソッドにきちんと入れられているこの呼び出しで数秒間ハングします。 ボタンは、ストリームの再生が開始されるまでクリックされていないことを示しています。そのため、最初にユーザーはボタンをタップしたのか不足しているのか疑問に思っています。 「Wait ...」や「Buffering」などのボタンの横にあるTextViewラベルを更新してから、ストリームの開始後にクリアして、ボタンが押されたことをユーザーが知っていることを確認します。 これをデバッグでステップ実行しても、onClickが終了するまでラベルは更新されません。私は、ラベルのテキストをクリアする最後の行をコメントすることができ、 "Buffering ..."に設定されているのを見ることができます。しかし、それがonClickを終了した後にのみ。これはメディアプレーヤーのcreate()メソッドを使用する際の制限ですか?

final Button startbutton = (Button) findViewById(R.id.Button01); 
this.tvBuffering = (TextView) findViewById(R.id.tvBuffering); 

startbutton.setOnClickListener(new View.OnClickListener() { 
     public void onClick(View v) { 
      tvBuffering.setText("Buffering..."); 
      //do something like invalidate() here?? 
      startPlaying(); //blocks here for a few seconds to buffer then plays. 
      tvBuffering.setText(" "); //clear the text since it's playing by now. 
     } 
    }); 

答えて

1

それは、ユーザがそれらの数秒間行うことをしようと何でもについてちょうどブロックしますので、意図的にUIに遅延のその種が含まれるように、このような素晴らしいアイデアではありません。私はあなたのstartPlaying()prepare()start()との呼び出しが含まれていると仮定しています。すぐに利用できないソース(ストリームなど)からデータを取得する場合は、代わりにprepareAsync()を使用する必要があります。準備が完了して準備が完了するまでブロックするのではなく、すぐに戻ります。

あなたは準備が簡単な例ですMediaPlayer.OnPreparedListener

を経て完成したら、次に行動を取るためにあなたのMediaPlayerにコールバックを添付することができます。 メソッドのprepare()prepareAsync()に変更し、からstart()コールを削除する限り、OnClickListenerは同じままにできます。

startbutton.setOnClickListener(new View.OnClickListener() { 
    public void onClick(View v) { 
     tvBuffering.setText("Buffering..."); 

     startPlaying(); //which should call prepareAsync() instead of prepare() 
         //and have no call to start() 
    } 
}); 

mYourMediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() { 
    @Override 
    public void onPrepared(MediaPlayer mp) { 
     start(); 
     tvBuffering.setText(" "); 
    } 
}); 
+0

恐ろしい答え!感謝万円! –

関連する問題