首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Android 銀行叫號式語音播放隊列:單線程循環播放實現方案

     編輯:程式設計綜合問答

需求場景

多條語音消息同時到達,需按順序播放:前一條播放完成後自動播放下一條。

核心架構:單線程 + 隊列 + 完成回調

public class VoicePlayer {
    private final Queue playQueue = new ConcurrentLinkedQueue<>();
    private final MediaPlayer mediaPlayer = new MediaPlayer();
    private boolean isPlaying = false;
    private final Handler handler = new Handler(Looper.getMainLooper());

    public void enqueue(String text) {
        playQueue.offer(text);
        if (!isPlaying) playNext();
    }

    private void playNext() {
        String text = playQueue.poll();
        if (text == null) { isPlaying = false; return; }
        
        isPlaying = true;
        // TTS 合成或預錄音頻播放
        mediaPlayer.reset();
        try {
            mediaPlayer.setDataSource(generateAudioFile(text)); // 或 TTS speak
            mediaPlayer.prepareAsync();
            mediaPlayer.setOnPreparedListener(mp -> mp.start());
            mediaPlayer.setOnCompletionListener(mp -> {
                handler.post(this::playNext); // 切換到主線程循環
            });
        } catch (IOException e) {
            handler.post(this::playNext); // 出錯跳過
        }
    }
}

關鍵點

  • 單線程串行:避免多線程並發播放導致聲音重疊/資源競爭
  • 完成回調驅動:OnCompletionListener 觸發下一條,天然順序保證
  • 錯誤容錯:單條播放失敗不阻塞隊列,直接跳過
  • TTS 整合:若用 TextToSpeech,onUtteranceCompleted 替代 MediaPlayer 回調

進階優化

  • 優先級隊列:緊急叫號插隊
  • 音頻預加載:緩存常用語音文件
  • 前台服務:防止系統殺死播放進程

語音播放隊列本質是「生產者-消費者」單消費者模型。MediaPlayer/TTS 異步回調驅動消費,代碼簡潔且順序嚴格保證。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved