3

这怎么能在android中完成?

public final Timer timer = new Timer(10, new ActionListener() {

        @Override
        public void actionPerformed(ActionEvent e) {  
          // Do task here       
        }
    });

我需要能够调用 timer.start(); 来自计时器所在的活动。

4

4 回答 4

9

在大多数情况下,使用处理程序而不是定时器要好得多。处理程序能够发送延迟消息。使用 Handler 的好处是:

  • 它在主(UI)线程上运行 -> 可以访问视图(与不能直接访问视图的计时器不同)
  • 如果需要,您可以删除待处理的延迟消息
  • 更少的代码

例子:

class MyActivity extends Activity {

    private static final int DISPLAY_DATA = 1;
    // this handler will receive a delayed message
    private Handler mHandler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            // Do task here
            if (msg.what == DISPLAY_DATA) displayData();
        }
 };

 @Override
 void onCreate(Bundle b) {
     //this will post a message to the mHandler, which mHandler will get
     //after 5 seconds
     mHandler.sendEmptyMessageDelayed(DISPLAY_DATA, 5000);
 }
}
于 2012-07-29T10:49:48.853 回答
4

尝试这样的事情:

// this will run when timer elapses
TimerTask myTimerTask = new TimerTask() {

    @Override
    public void run() {
        // ...
    }

};

// new timer
Timer timer = new Timer();

// schedule timer
timer.schedule(myTimerTask, delayInMs);

如果您希望在活动的主线程中完成任务,请像这样修改它:

// get a handler (call from main thread)
final Handler handler = new Handler();

// this will run when timer elapses
TimerTask myTimerTask = new TimerTask() {
    @Override
    public void run() {
        // post a runnable to the handler
        handler.post(new Runnable() {
            @Override
            public void run() {
                // ...
            }
        });
    }
};

// new timer
Timer timer = new Timer();

// schedule timer
timer.schedule(myTimerTask, delayInMs);
于 2012-07-29T10:27:49.173 回答
4

Android 也有一个不错的CountDownTimer

于 2012-07-29T10:43:51.583 回答
0

我已经在另一个问题中回答了这个问题。

我会避免使用 TimerTask,如果你把它们中的很多都关掉,它们不仅难以管理,而且对性能不利。

这些天,我会推荐Handler几乎任何基于时间的任务。

请参阅定时器应用程序

于 2012-10-27T21:32:42.087 回答