私はオンライン ラジオ ストリーミング プロジェクトに取り組んでいます。URL からストリームを再生し、別の json URL からサウンド トラック情報を解析します。私がしたことは、10秒ごとにjsonを繰り返し解析することだけです。そのため、サウンドトラックが変更されているときに、その特定のトラックのトラック情報を取得できます。しかし、トラックが変更される 30 秒以上前に json ファイルが更新されているため、トラックとトラック情報の間に顕著な相違がある場合があります。
これは、ストリームを再生している asyncTask クラスです。
public class RadioPlayer extends AsyncTask<String, Void, Void> {
MediaPlayer mediaPlayer = new MediaPlayer();
@Override
protected void onPreExecute() {
}
@Override
protected Void doInBackground(String... params) {
mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
try {
mediaPlayer.setDataSource(params[0]);
mediaPlayer.prepare();
} catch (IllegalArgumentException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (SecurityException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (IllegalStateException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
// might take long! (for buffering, etc)
mediaPlayer.start();
return null;
}
@Override
protected void onPostExecute(Void result) {
}
10 秒ごとにトラック情報を更新するハンドラーを次に示します。
private void getSongStatistics() {
r = new Runnable() {
public void run() {
try {
title = tsp.parseInitiator();
} catch (ClientProtocolException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
Log.i("title", title);
try {
String[] subTitles = title.split("-");
tvTitle.setText(subTitles[1]);
tvArtist.setText(subTitles[0]);
} catch (Exception e) {
tvArtist.setText(title);
}
handler.postDelayed(this, 10000);
}
}
};
handler.postDelayed(r, 10000);
}
この奇妙な問題を取り除く解決策はありますか?