我有一个在线音乐播放器,我的问题是当用户按下播放按钮时 我的应用程序冻结1或2秒(网络速度) 我播放我的服务器链接的音乐并将其放入语音变量并播放流 我的代码问题是什么? 感谢。
我的代码:
detail_voice.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Snackbar snackbar = Snackbar.make(detail_date, " " + "دارم میگیرررررررررمش :| :)))", Snackbar.LENGTH_SHORT);
snackbar.show();
try {
mp.setDataSource(Voice);
mp.prepare();
mp.start();
detail_voice.setVisibility(View.GONE);
detail_voice_stop.setVisibility(View.VISIBLE);
} catch (IOException e) {
e.printStackTrace();
}
}
});
detail_voice_stop.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
detail_voice.setVisibility(View.VISIBLE);
detail_voice_stop.setVisibility(View.GONE);
mp.stop();
mp.reset();
detail_voice_stop.setVisibility(View.GONE);
}
});
答案 0 :(得分:0)
您提供的代码并不广泛,但我的猜测是您的问题可能确实与通过网络加载数据有关。通常在通过网络加载数据时,您需要执行异步以避免程序不必要地等待数据,并在此期间冻结。
MediaPlayer类有一个 prepareAsync()方法,它将为您执行此操作。但是,您不能再将 start()方法置于其下方,因为它现在是异步的。尝试替换此代码:
mp.setDataSource(Voice);
mp.prepare();
mp.start();
有了这个:
mp.setDataSource(Voice);
mp.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer player) {
player.start();
}
});
mp.prepareAsync();
如果该代码解决了问题,那么您的连接确实是问题所在。您应不但每次单击时都使用 setOnPreparedListener()方法。我建议将它移到 onClickListener()方法之外,这样它只执行一次。
This Stackoverflow question也有很好的实施方式。它也许值得一读。