android - Android应用程序上的按钮滞后

标签 android button audio

我有一个按钮,可以播放音频文件,切换 bool(boolean) 值和为按钮设置新文本(从播放到停止,反之亦然)。

不幸的是,当我按下“播放”按钮时,使按钮说“停止”会有很大的滞后,而当我再次按下按钮以停止音频播放时,也存在滞后。

我将不胜感激,谢谢!

public void Playbutton(View view) {
        if (playbuttonstatus) {
            playBtn.setText(getString(R.string.stop));
            playbuttonstatus = false;

            File file = new File(Environment.getExternalStorageDirectory(), "test.pcm");

            int shortSizeInBytes = Short.SIZE / Byte.SIZE;

            int bufferSizeInBytes = (int) (file.length() / shortSizeInBytes);
            short[] audioData = new short[bufferSizeInBytes];

            try {
                InputStream inputStream = new FileInputStream(file);
                BufferedInputStream bufferedInputStream = new BufferedInputStream(inputStream);
                DataInputStream dataInputStream = new DataInputStream(bufferedInputStream);

                int i = 0;
                while (dataInputStream.available() > 0) {
                    audioData[i] = dataInputStream.readShort();
                    i++;
                }

                dataInputStream.close();

                audioTrack = new AudioTrack(
                        AudioManager.STREAM_MUSIC,
                        11025,
                        AudioFormat.CHANNEL_OUT_MONO,
                        AudioFormat.ENCODING_PCM_16BIT,
                        bufferSizeInBytes,
                        AudioTrack.MODE_STREAM);

                audioTrack.play();
                audioTrack.write(audioData, 0, bufferSizeInBytes);


            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
        } else {
            playBtn.setText(getString(R.string.play));
            playbuttonstatus = true;
            audioTrack.pause();
            audioTrack.flush();
        }
    }

最佳答案

您应该使用AsyncTask进行声音播放。
onPreExecute中,您将设置按钮文本并设置 bool(boolean) 标志(UI主线程)。
doInBackground中,您将检索声音文件并播放它(工作线程)。
如果用户按下停止按钮,则取消当前的asyncTask并更新按钮文本。

关于android - Android应用程序上的按钮滞后,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40704944/

相关文章:

javascript - 语句仅在 for 循环中发生一次 - JavaScript

javascript - 根据图像名称播放mp3文件

c# - Unity - 麦克风检查是否静音

iphone - 如何仅在用户摇动 iPhone 时播放音频文件?

android - 当我向 ListView 项目添加 View 时,该项目不再正确 react

Java/Android 如何从 html 响应中获取 JSON?

android - 无法在模拟器(Andengine)上运行游戏

android - android中关于Intent.ACTION_VIEW的查询

css - 编号按钮 - 不同样式的编号和标题

javascript - 按钮不执行 window.location