播放服务器音乐时冻结Android应用程序

时间:2018-05-21 17:25:16

标签: java android android-mediaplayer

我有一个在线音乐播放器,我的问题是当用户按下播放按钮时 我的应用程序冻结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);
    }
});

1 个答案:

答案 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也有很好的实施方式。它也许值得一读。