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

Java 播放服务器音乐时冻结android应用程序,java,android,android-mediaplayer,Java,Android,Android Mediaplayer,我有一个在线音乐播放器,我的问题是当用户按下播放按钮 我的应用程序冻结1或2秒(网络速度)。 我播放服务器链接的音乐,并将其放入语音变量中,然后播放该链接的流。 我的代码有什么问题? 谢谢 我的代码: detail_voice.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Snackbar snackbar = Snackbar.

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

您提供的代码并不广泛,但我猜您的问题可能确实与通过网络加载数据有关。通常,在通过网络加载数据时,您希望异步执行此操作,以避免程序不必要地等待数据,并在这段时间内冻结

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()方法之外,这样它只执行一次


也有一个很好的实现。这可能也值得一读。

我的回答完全回答了你的问题吗?