1

我最近开始使用 Java 并正在探索 Android 开发。我试图移植我制作的一个 Java 程序,但是在让 java Timer 在 Android 中以相同的方式运行时遇到了一些困难。我阅读了许多帖子,它们在大多数情况下表示最好在 android 中使用 Handler 类而不是 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 中做类似的事情,但我遇到了一些困难。处理程序滴答似乎没有以适当的时间间隔触发。与我需要的相比,它们似乎相当慢。到目前为止,这是我在 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());
        }
    }
};

原谅半伪代码。任何人都可以解释一下吗?多谢你们。

4

3 回答 3

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();
}  
}
于 2013-04-07T20:32:20.103 回答
0

看看Android Timer 我猜它已经拥有你需要的一切。从每 1 秒打勾到轻松完成等等。
这是一个如何设置 TimerTask 的示例:setup 不确定是否需要,但我只记得我做了这个。

于 2013-04-07T20:21:42.260 回答
0

如果您决定不使用 Timer(无论出于何种原因),您可以编写一个单独的 Thread 休眠 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 ,否则它将永远(或几乎)在后台运行。

于 2013-04-07T20:28:05.927 回答