在Android中使用AsyncTask和mediaplayer

时间:2014-09-16 07:10:51

标签: android android-mediaplayer

我正在开发一个Android应用程序我有一个从在线流媒体播放音乐的功能它需要一段时间使应用程序午餐,所以我需要将媒体播放器任务给一个线程,使应用程序午餐快速和线程拿媒体播放器 所以,当我进行此操作时,应用程序给我一个例外mediaplayer.prepare()需要主线程,所以我将在我的代码中发布我尝试的内容:

public void playsong()
{
            mediaplayer mp =new mediaplayer();
            String currentUrl = sora.getUrl(this);  
            mp.reset();
            mp.setDataSource(currentUrl);
            mp.setAudioStreamType(AudioManager.STREAM_MUSIC);
            mp.setOnBufferingUpdateListener(this);
            mp.prepare();
            mp.start();

}




public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.player);
        initView();
        thread.start();

         }


Thread thread = new Thread()
{
    @Override
    public void run() {
        try {
          playSong();
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
    }
};

2 个答案:

答案 0 :(得分:1)

为此你必须使用AsyncTask ......

class PalyMusic extends AsyncTask<Void, Void, Void> {

    @Override
    protected void onPreExecute() {
        // TODO Auto-generated method stub
        super.onPreExecute();

    }

    @Override
    protected Void doInBackground(Void... unused) {


      //your background process


        return (null);
    }

    protected void onPostExecute(Void unused) {

        //here you can call your mp.prepare();
    }

}

并且用于调用此

   new PalyMusic().execute();

不要忘记将其添加到AndroidManifest.xml文件中:

<uses-permission android:name="android.permission.INTERNET"/>

答案 1 :(得分:1)

使用prepareAsync()方法而不是prepare()

,简单明了
public void playsong()
    {
        try {
            final MediaPlayer mp = new MediaPlayer();
            String currentUrl = sora.getUrl(this);
            mp.reset();
            mp.setDataSource(currentUrl);
            mp.setAudioStreamType(AudioManager.STREAM_MUSIC);
            mp.setOnBufferingUpdateListener(this);
            mp.prepareAsync();

            mp.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
                @Override
                public void onPrepared(MediaPlayer mediaPlayer) {
                    mp.start();
                }
            });
        }catch (Exception e){
            e.printStackTrace();
        }

    }