我正在开发一个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();
}
};
答案 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();
}
}