mediaplayer,其中包含异步加载的音频列表

时间:2014-04-06 07:43:39

标签: android android-asynctask media-player

我有一个音乐播放器应用程序,应该通过在线流媒体播放音乐。它有一个音频标题列表,一个播放按钮和进度条。点击列表项后,它会执行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>

1 个答案:

答案 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();
}
 }