2013-03-11 156 views
0

我有几个功能必须同步实施3秒。我使用soundpool,振动模式和背景动画播放声音。他们三人都分开工作。但我无法正确计时,以便一起开始。同步执行功能

这3个函数需要每15秒重复调用一次。并会在点击按钮时停止。我试着用这样的东西,但它不能正常工作。

myThread = new Thread(new Runnable(){ 

      @Override 
      public void run() { 
       // TODO Auto-generated method stub 

       while (shouldRun==true) { 
        try {      
         mHandler.post(new Runnable() { 

          @Override 
          public void run() { 

           anim(); 
           vibration(); 
           sound(); 



          } 
         }); 
         mHandler.postDelayed(new Runnable() { 
          public void run(){ 
          try { 
           Thread.sleep(15000); 
          } catch (InterruptedException e) { 
           // TODO Auto-generated catch block 
           e.printStackTrace(); 
          } 
          } 
         }, 3000); 
        } catch (Exception e) { 
         // TODO: handle exception 
        } 
       }    
      }// end of outer run()   
     }); 
     myThread.start(); 

这是正确的方法吗?或者有其他方法吗?

public void vibration(){    
    int dash = 1000;  
    int medium_gap = 500; 

    long[] pattern = { 0, // Start immediately 
     dash, medium_gap,dash , medium_gap 
    }; 
    // Only perform this pattern one time (-1 means "do not repeat") 
    v.vibrate(pattern, -1); 

} 


linear = (LinearLayout) findViewById(R.id.lay);// this line is after setContentView in onCreate 
public void anim(){ 

     drawable.addFrame(new ColorDrawable(Color.RED), 1000); 
     drawable.addFrame(new ColorDrawable(Color.WHITE), 500);   
     drawable.setOneShot(false);  
     linear.setBackgroundDrawable(drawable);   
     drawable.start(); 

    } 

sp = new SoundPool(5, AudioManager.STREAM_NOTIFICATION, 0); 
buzzer = sp.load(this, R.raw.buzzer, 0); 
public void sound(){ 
     sp.play(buzzer, 1,1, 0, 0, 1); //start alert tone 
    } 

回答

0

请尝试以下操作。

myThread= new Thread(new Runnable(){ 

      @Override 
      public synchronized void run() { 
       // TODO Auto-generated method stub 


      Write your stuff.............. 
      .................... 

      } 
     }).start(); 
+0

@拉玛昌德拉·雷迪阿姆阿姆()是不帮助我。即使现在,我的动画卡住了,振动发生在一些奇怪的方式。 – newbee 2013-03-11 10:38:25

0

是否真的需要同步实现这样的功能? Android UI是异步的,并有很好的理由。你没有写出你是如何实施动物,振动和健全的方法。我不确定他们可以这样实现,特别是动画。在android中绘图通常应该在主线程中完成。如果您想处理应用程序暂停或关键事件,或者取消您的响铃,您应该能够对传入的事件做出反应,而您当前的线程不允许这样做。

我建议你检查API如何播放声音以及如何振动。然后使用任何事件来开始操作。启动振动器,开始播放声音并开始动画。使用处理程序在3秒后发送延迟的消息以停止它。取消声音播放,振动,停止重新绘制动画。并在停止15秒后使用处理程序再次启动它。对我来说这似乎很重要,哪里会有背景动画,以及将使用哪个小部件?你可以使用SurfaceHolder来做到这一点,但除非你需要使用同步代码,否则不要那样做。

+0

同步,我的意思是我希望他们都似乎一起出现。由于即时通讯新的android开发,我不太了解使用线程和处理程序。无论我迄今为止建立的代码是通过遵循其他帖子的各种链接。如果还有其他方法可以实现这一点,请直接给我 – newbee 2013-03-11 11:01:14

0

没有看到所有的代码,我不确定它是否需要在UI线程上,但可能是动画。我的想法是让每个人都有自己的线索,只是有一个播放,暂停和释放方法。所以3秒后告诉他们全部停下来。然后告诉他们所有人玩。尽管动画将从其运行方法中将某些内容发布到UI线程。另一个问题是...取决于你需要它们的同步程度,这可能会有问题,因为在较旧的Android版本上播放声音可能会有明显的延迟。


编辑:您还可以更新您的问题只是给了什么不顺心作为一个更详细一点,做自己各地同时启动,起到一个其他的或别的东西之后。

这是一些代码的刺。如果下面的代码添加到您的类,然后创建并启动线程的地方明智的(如视图创建)

Sound s = new Sound(); 
s.start(); 
Vibrate vi = new Vibrate(v); 
vi.start(); 

,并设置其发布到真正在你的onStop()方法。最后,在你的处理器的运行方法代替:

anim(); 
vibration(); 
sound(); 

有:

s.play = true; 
vi.play = true; 
anim(); 

//类中使用公共同步无效的run添加

class Sound extends Thread 
{ 
    public boolean play = false; 
    SoundPool sp; 
    int buzzer; 
    public boolean released = false; 

    public Sound() 
    { 
     sp = new SoundPool(5, AudioManager.STREAM_NOTIFICATION, 0); 
     buzzer = sp.load(this, R.raw.buzzer, 0); 
    } 

    public void run() 
    { 
     while (!released) 
     { 
      if (play) 
      { 
       sp.play(buzzer, 1,1, 0, 0, 1); //start alert tone 
       play = false; 
      } 
      else 
      { 
       try 
       { 
        Thread.sleep(5); 
       } 
       catch (Exception ex) {} 
      } 
     } 

     // release the sound pool 
    } 
} 

class Vibrate extends Thread 
{ 
    public boolean play = false; 
    public boolean released = false; 
    int dash = 1000;  
    int medium_gap = 500; 
    Vibrator v; 

    long[] pattern = { 0, // Start immediately 
     dash, medium_gap, dash , medium_gap }; 

    public Vibrate(Vibrator v) 
    { 
     this.v = v; 
    } 

    public void run() 
    { 
     while (!released) 
     { 
      if (play) 
      { 
       // Only perform this pattern one time (-1 means "do not repeat") 
       v.vibrate(pattern, -1); 
       play = false; 
      } 
      else 
      { 
       try 
       { 
        Thread.sleep(5); 
       } 
       catch (Exception ex) {} 
      } 
     } 
    } 
} 
+0

@ hack_on请看我编辑的问题 – newbee 2013-03-11 10:58:20

+0

@newtoandroid看到我编辑的答案! – 2013-03-11 12:08:09

+0

谢谢。我一定会尝试这个ñ回到你身边 – newbee 2013-03-11 12:10:11