2013-03-11 147 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