2014-02-05 22 views
1

以下是一些代码,即成功地被称为约每秒两次。声音文件长约100毫秒。它只播放一次,但我预计这会继续播放它:随后的调用会在play调用中跨过,而没有抛出异常,但也没有声音。如何定期播放声音?

有没有一种有效的工作方式?

 InputStream knockAudio = fetchResourceFile().getData("mysound.wav"); 
     try { 
      final Media m = MediaManager.createMedia(knockAudio, "audio/wav"); 

      onClickTask = new TimerTask() { 
       @Override 
       public void run() { 
        m.cleanup(); // Here's something I tried, but had no effect 
        m.prepare(); // I also tried this without cleanup 
        m.play(); // But to start with just had this (no cleanup or prepare) 
       } 
      }; 

     } catch (IOException ex) { 
      Log.e(ex); 
     } 

回答

0

谢谢@Shai Almog的信息。这导致我这样实现它:

初始化是这样的:

InputStream myAudio = fetchResourceFile().getData("mysound.wav"); 

要重复播放我这样做:

myAudio.reset(); // The input stream needs to go back to the beginning 
myClip = MediaManager.createMedia(myAudio, "audio/wav"); 
myClip.play(); 
0

您也可以选择使用Timer安排任务:

 onClickTask = new TimerTask() { 
      @Override 
      public void run() { 
       m.play(); // But to start with just had this (no cleanup or prepare) 
      } 
     }; 

     Timer time = new Timer(); 
     time.schedule(onClickTask, 0, 2000); 
+0

我一直在努力,在这个问题更清楚 - 我我正在从计时器中调用任务,但声音不会再次发挥作用。 – noelicus

1

声音上一个代号清除/先玩后会自动删除。你必须重新创建它,而不是听起来那么昂贵。

其原因与媒体播放中缺乏适当清理的最常见错误有关,所以我们隐含地这样做以避免这种内存泄漏。由于您正在提取的输入流是在RAM中创建的,因此它的开销应该相对较低。