2013-04-07 49 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。