我有一个音乐播放器应用程序,应该通过在线流媒体播放音乐。它有一个音频标题列表,一个播放按钮和进度条。点击列表项后,它会执行asyncTask,从url加载媒体播放器中的数据源并进行准备。
继承列表项单击侦听器:
leclistv.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> arg0, View arg1,int p, long arg3)
{
url=geturl(p);
new PrepareStream().execute(url);
}
});
asynctask类:
class PrepareStream extends AsyncTask<String, String, String> {
@Override
protected void onPreExecute() {
super.onPreExecute();
progress.show();
}
@Override
protected String doInBackground(String... opath) {
try {
String url = new String(opath[0]);
mp.reset();
mp.setDataSource(url);
mp.prepare();
} catch (IllegalArgumentException e) { e.printStackTrace(); } catch (IllegalStateException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace();}
return null;
}
protected void onProgressUpdate(String... progress) {
}
@Override
protected void onPostExecute(String file_url) {
btnPlay.setEnabled(true);
songProgressBar.setProgress(0);
songProgressBar.setMax(100);
updateProgressBar();
progress.dismiss();
}
}
但这只能工作一次。一旦我点击任何列表项,它加载就好并且播放得很好。但是如果我第二次点击任何列表项,它会崩溃 - 因为asyncTask只能使用一次。有没有办法让它每次都有效?如果没有,是否有另一种方法可以做到这一点?
PS:我可以在不使用asynctask的情况下以简单的方式完成,但我必须使用,因为音频是从服务器加载的,所以prepare()需要时间,因此我需要在加载时显示progressDialog。 / p>答案 0 :(得分:0)
媒体播放器的简单解释以及如何处理与之相关的各种问题.. reference link
来自上述链接的参考代码
public class MyService extends Service implements MediaPlayer.OnPreparedListener {
private static final String ACTION_PLAY = "com.example.action.PLAY";
MediaPlayer mMediaPlayer = null;
public int onStartCommand(Intent intent, int flags, int startId) {
...
if (intent.getAction().equals(ACTION_PLAY)) {
mMediaPlayer = ... // initialize it here
mMediaPlayer.setOnPreparedListener(this);
mMediaPlayer.prepareAsync(); // prepare async to not block main thread
}
}
/** Called when MediaPlayer is ready */
public void onPrepared(MediaPlayer player) {
//When Media prepare this method work and you start your player
player.start();
}
}