2

我需要你每秒更新我的 TextView。我用 Timer 和 TimeTask 编写了它,但每个人都说它已弃用。有人可以告诉我如何制作简单的计时器,它每 1 秒更新一次 TextView 并有可能从 UI 中阻止它吗?

4

3 回答 3

9

您可以使用处理程序或倒数计时器

Handler m_handler;
Runnable m_handlerTask ;  
m_handler = new Handler();   
m_handlerTask = new Runnable()
{
  @Override 
  public void run() { 

    // do something. update text view.  
    m_handler.postDelayed(m_handlerTask, 1000);    

  }
  };
 m_handlerTask.run();

停止

m_handler.removeCallbacks(m_handlerTask);

检查此链接以获取倒数计时器、处理程序、计时器

用于计时器的 Android 线程

于 2013-08-29T08:52:07.477 回答
7

无需为此创建单独Handler的(如当前接受的答案)。相反,只是直接到postDelayed()的内部消息队列:RunnableTextView

Runnable runnable = new Runnable () {
    @Override public void run() {
        // do some work, then repost:
        textview.postDelayed(runnable, 1000);
    }
};
// post with an initial 1000 ms delay
textview.postDelayed(runnable, 1000);
// or post without an initial delay
textview.post(runnable);
// or even run the runnable right away the first time
runnable.run();

或者,如果您想要完成的只是“重绘” TextView,请使用invalidate()(或postInvalidate()从非 UI 线程)。还有一些重载允许您将失效限制为特定的矩形,您可以利用它来实现更有效的实现。

于 2013-08-29T09:50:50.513 回答
0

您可以使用一个简单的处理程序来完成您需要做的事情。无论如何,您可以使用调度程序的方式:

private ScheduledExecutorService scheduler;
...    

if(scheduler != null)
{
    scheduler.shutdown();
    scheduler = null;
}

scheduler = Executors.newSingleThreadScheduledExecutor();

scheduler.scheduleAtFixedRate(new Runnable()
{
    public void run()
    {
         // do your stuff...
    }
}, Consts.KEEP_ALIVE_TIMEOUT, Consts.KEEP_ALIVE_TIMEOUT, TimeUnit.MINUTES);
于 2013-08-29T08:53:54.923 回答