2013-04-07 27 views
0

我最近開始使用Java,並且正在探索Android開發。我試圖移植一個我製作的Java程序,但是我在獲取java Timer以在Android中以相同方式運行時遇到了一些困難。我閱讀了大量的帖子,他們大部分都表示,最好在Android中使用Handler類而不是Timer。Android中的Java Timer相當於

這是我用Java定時器:

playTimer = new Timer(1000/model.getFPS(), new ActionListener() { 
    public void actionPerformed(ActionEvent evt) { 
     // do something 
     ... 
     if(finished everything) playTimer.stop(); 
    } 
}); 

而且一旦某個按鈕被點擊,我只想跑「playTimer.start()」來啓動它。正如你所看到的,我已經設置了它,以便用戶可以設置他們想要的FPS(只需將Timer類的第一個參數設置爲1000/model.getFPS())即可。

現在我試着在Android中使用處理程序做類似的事情,但我遇到了一些困難。看起來Handler蜱沒有按適當的時間間隔發射。看起來它們比我所需要的要慢。這是我到目前爲止在android上所做的:

public void startTimer() { 
    playHandler = new Handler(); 
    startTime = System.currentTimeMillis(); 
    playHandler.removeCallbacks(updateTimeTask); 
    playHandler.postDelayed(updateTimeTask, 0); 
} 

private Runnable updateTimeTask = new Runnable() { 
    public void run() { 
     // do something 
     ... 

     if(finished everything) playHander.cancel(); 
     else { 
      playHandler.postDelayed(updateTimeTask, 1000/model.getFPS()); 
     } 
    } 
}; 

打擾半僞碼。任何人都可以擺脫光線嗎?多謝你們。

+0

處理程序是粗略的估計。在大約1秒內做大約100ms。這並不意味着任何需要確切的東西。 – 2013-04-07 20:23:36

+0

作爲'Handler'運行在'UIThread'上,它只會在線程上得到時間,無論何時它有一個時隙,它不控制它自己,所以它不是完全嚴格的'Handler'將完成。如果是這樣的話,用戶界面在某些時候可能會不響應。 – Darwind 2013-04-07 20:52:01

回答

2

您可以使用下面的計時器。計時器每秒鐘運行一次遞增計數器。在textview中顯示計數器值。

計時器在另一個線程上運行。所以你應該在UI線程上設置文本。

計數器從0運行到99. 99後定時器被取消。當不需要時也取消定時器,如onPause()

public class MainActivity extends Activity { 
TextView _tv,tv2; 
Timer _t; 
int _count=0; 


/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    _tv = (TextView) findViewById(R.id.textView1); 
    _t = new Timer(); 
    _tv.setText(R.string.app_name); 
    _t.scheduleAtFixedRate(new TimerTask() { 
      @Override 
      public void run() { 
       _count++; 

       runOnUiThread(new Runnable() //run on ui thread 
       { 
        public void run() 
        { 

         _tv.setText(""+_count); 
         if(_count==99) 
         { 
          _t.cancel(); 
         } 
       } 
       }); 
      } 
     }, 1000, 1000); //change this value of 1000 to whatever you need. 


} 
@Override 
protected void onPause() { 
    // TODO Auto-generated method stub 
    super.onPause(); 

    _t.cancel(); 
} 
} 
+0

謝謝!這正是我需要的。在嘗試使用Handler類之前,我有類似的事情,事實證明這個問題主要是由於Android虛擬設備的性能低下造成的。 – Tesla 2013-04-08 06:22:48

0

看看Android Timer 它已經有你需要的一切,我猜。從每1秒鐘滴答作響地完成等等。
下面是一個如何設置TimerTask的例子:setup 不知道你是否需要這樣的,但我只記得我做到了這一點。

0

如果您決定不使用Timer(無論出於何種原因),您只需編寫一個單獨的線程,睡眠x毫秒,然後喚醒並調用您想調用的任何Runnable。這將非常精確。我有它在10毫秒級別工作,它工作得很好。

請記住,它必須調用Runnable,因爲單獨的線程不能直接影響主顯示線程上的任何內容。

public boolean keepPlayingAnimation = true 
Handler h = new Handler() 
Runnable updateDisplay = new Runnable(){ 
    public void run(){ 

     //do something in my display; 
    } 
} 

new Thread(){ 
    public void run(){ 
    while(keepPlayingAnimation){ 
     try{ 
      sleep(10); 
     }catch(Exception e){ 

     } 
     h.post(updateDisplay); 
    } 
    } 
}.start(); 

只是不要忘記當你與這個事業做否則會坐在那裏,在後臺運行,直到永遠(或只是)到keepPlayingAnimation設置爲false。