2014-09-28 55 views
0

在我的应用程序中,我为图像设置动画,每当它达到某个点时,我都想用MediaPlayer播放声音。声音由sound=MediaPlayer.create创建,并以sound.start()开始。我的问题是,声音并不总是播放:虽然它通常是正确播放,但有时会丢失或缩短。使用Android版本4.4而不是4.3版本可以看到此问题。同步发出声音

起初,我的声音是从UI线程发出的。然后我尝试在第二个线程中管理它,但没有任何改进。我能做什么?

这是写在我的专用线程代码:

private class EmitSound extends Thread implements OnCompletionListener,OnInfoListener,OnErrorListener{ 
    private MediaPlayer sound; 
    private boolean killProcess=false; 
    private Boolean emitSound=false; 

    public EmitSound(){ 
     sound=MediaPlayer.create(myActivity,R.raw.sound); 
     sound.setOnCompletionListener(this); 
     sound.setOnInfoListener(this); 
     sound.setOnErrorListener(this); 
    } 

    public void run(){ 
     while(!killProcess){ 
      synchronized(emitSound){ 
       if(emitSound){ 
        Logger.getLogger("MyApp").log(Level.Info,"Sound started"); 

        sound.start(); 

        emitSound=false; 
       } 
      } 
     } 
    } 

    public void EmitSound(){ 
     synchronized(emitSound){ 
      emitSound=true; 
      Logger.getLogger("MyApp").log(Level.Info,"Demand"); 
     } 
    } 

    public void KillProcess(){ 
     sound.release(); 

     killProcess=true; 
    } 

    @Override 
    public void onCompletion(MediaPlayer mp) { 
     Logger.getLogger("MyApp").log(Level.INFO,"Sound finished"); 
    } 

    @Override 
    public boolean onInfo(MediaPlayer mp, int what, int extra) { 

     Logger.getLogger("MyApp").log(Level.INFO,"Info "+Integer.toString(what)+"/"+Integer.toString(extra)); 

     return false; 
    } 

    @Override 
    public boolean onError(MediaPlayer mp, int what, int extra) { 

     Logger.getLogger("MyApp").log(Level.INFO,"Error "+Integer.toString(what)+"/"+Integer.toString(extra)); 

     return false; 
    } 
} 

而当我想发出声音,我称之为myProcess.EmitSound()从一个线程是负责编制成SurfaceViewCanvas的。

我增加了一个OnCompletionListener,一个OnInfoListenerOnErrorListener到我的线程加上原木的需求的发射和声音的开始,一切似乎OK:需求制成,声音启动,声音完成并重新启动循环。我从来没有给我的onInfo也没有接到我的onError功能,但声音有时还没有发出。它真的好像MediaPlayer是越野车...

+0

您能告诉我们一些代码吗?通过阅读这些内容无法告诉你正在做什么。 – vlatkozelka 2014-09-28 15:22:44

回答

0

使用而不是MediaPlayer解决了我的问题!