一遍又一遍地运行代码

Posted

技术标签:

【中文标题】一遍又一遍地运行代码【英文标题】:Run code over and over 【发布时间】:2012-07-30 16:00:45 【问题描述】:

在我的应用程序中,我在TextView 中显示了一个时钟,我想实时更新它。我试着这样运行它:

public void clock() 
    while(clock_on == true) 
        executeClock();
    


public void executeClock() 
    TextView timeTv = (TextView) findViewById(R.id.time);
    long currentTime=System.currentTimeMillis();
    Calendar cal=Calendar.getInstance();
    cal.setTimeInMillis(currentTime);
    String showTime=String.format("%1$tI:%1$tM %1$Tp",cal);
    timeTv.setText(showTime);

但它不起作用。

【问题讨论】:

“不起作用”从不足以说明问题。 ***.com/questions/how-to-ask 什么不起作用?你有什么错误吗? 你试过循环clock()调用而不是executeClock()吗? 如何使用计时器并每秒更新一次用户界面,或者如果您愿意,可以更频繁地更新您的用户界面......?灵感:***.com/a/6702767/1525300. 您的while 循环太快,UI 无法更新。使用Handler 【参考方案1】:

请尝试:

private Handler handler = new Handler();
runnable.run();

private Runnable runnable = new Runnable() 


public void run() 

     //
     // Do the stuff
     //
     if(clock_on == true) 

             executeClock();

     

     handler.postDelayed(this, 1000);

;

【讨论】:

那会不会太频繁了?你必须做一个 if 语句而不是你的 while。 现在看起来很正确 :) 但我不确定运行方法中是否缺少 @Override【参考方案2】:

使用处理程序:

private Handler handler = new Handler() 

    @Override
    public void handleMessage(android.os.Message msg) 
            TextView timeTv = (TextView) findViewById(R.id.time);
            long currentTime=System.currentTimeMillis();
            Calendar cal=Calendar.getInstance();
            cal.setTimeInMillis(currentTime);
            String showTime=String.format("%1$tI:%1$tM %1$Tp",cal);
            timeTv.setText(showTime);

            handler.sendEmptyMessageDelayed(0, 1000);
    
;

【讨论】:

这个。您不仅需要一个处理程序来能够从任何地方更新文本视图(处理程序在 UI 线程中运行),您还可以使用它来运行延迟的代码......所以不要永远卡在 while 循环中,只需调用你的时钟每 500-1000 毫秒更新一次。

以上是关于一遍又一遍地运行代码的主要内容,如果未能解决你的问题,请参考以下文章

为啥 OnPreRender 被一遍又一遍地调用?

为啥这不会一遍又一遍地返回一个新值?爪哇

为啥在反应的“useState”钩子中一遍又一遍地设置初始状态

据说随机 API 一遍又一遍地返回相同的东西

一遍又一遍地运行相同的junit测试的简单方法?

如何阻止innerHtml表一遍又一遍地重复自己?