【问题标题】:How to prevent if-statement from being executed only once when its condition is first checked?如何防止 if 语句在第一次检查其条件时只执行一次?
【发布时间】:2014-01-23 22:32:19
【问题描述】:

我已经初始化了一个 int 变量i = 0。我的代码有一个无限循环,当活动开始时会立即检查它。在这个循环中,我需要在一段时间间隔(例如 3 秒)后执行某些任务。我的代码是这样的:

while(1){
if (System.currentTimeMillis() - learningTime > 3000) {
            learningTime = System.currentTimeMillis();

            i++;
        }
}

由于System.currentTimeMillis() - learningTime > 3000 在我的程序执行开始时为真,i 将快速递增到 1,之后每 3 秒递增一次。

如何在活动开始后3秒内强制i0递增到1

【问题讨论】:

  • 你应该使用 Handler 来处理这类事情,以免阻塞主线程。
  • 使用无限循环暂停处理不是一个好主意。在 UI 线程上,您将使您的应用程序无响应。在后台线程上,请改用 thread.sleep。您可以在您的 UI 线程中创建一个处理程序,并使用 postDelayed 方法在经过指定的时间后让一些代码在其中运行。
  • @W.K.S 好主意。很高兴告诉我如何实现处理程序来执行此任务?
  • 当然 :) 我已经发布了答案。

标签: java android loops time conditional


【解决方案1】:

将 System.currentTimeMillis() 值分配给 learningTime,使其为 0 > 3000

learningTime = System.currentTimeMillis()

而且,无论如何你都会用这段代码阻塞主线程。

这可以是Handler的一个例子

final Handler handler = new Handler();

Runnable runnable = new Runnable() {
    @Override
    public void run()
    {
        handler.postDelayed(this, 3000);
    }
};

handler.postDelayed(runnable, 3000);

Handler class Runnable Handler postDelayed

不管怎样,你不再需要learningTimei (?)

【讨论】:

  • 谢谢。它对我有用。我所做的是我将一个布尔标志初始化为 false,并且在handler.postDelayed(this, 3000); 之后,设置了该标志。我在while(1) 之后添加了我的代码,如果设置了标志,则执行它,因此,在 sleep 函数之后 i 在开始时递增,然后在我的代码中进行递增。 :)
【解决方案2】:

您可以使用处理程序来解决此问题,这样您就不会阻塞主线程。 我不确定这是否是理想的实现:

private static final long INTERVAL = 3000;//3 seconds
private Handler handler;


protected void onCreate(Bundle b)
{
    super(b);

    handler = new Handler();

    //post an action to execute after an INTERVAL has elapsed.
    handler.postDelayed(new Runnable(){

        public void run(){
            //do your stuff
            doYourStuff();

            //post the event again until a stopCondition is met.
            if(stopCondition==false){
                handler.postDelayed(this,INTERVAL);
            }

        }

    },INTERVAL);
}

【讨论】:

  • 现在假设使用循环线程不断调用的 onDraw() 方法而不是 while 循环。在每 10 帧每秒调用一次的 onDraw() 方法中运行这个处理程序会不会有问题?
  • 这有点含糊,请问您到底想做什么。原则上,您可以从处理程序更新 UI,但我认为您不需要 onDraw() 方法中的处理程序。
  • 好的,我会尽量说清楚。假设我的问题中的 while(1) 循环内部的内容被放在下面代码中的 learnMode 函数中,protected void onDraw(Canvas canvas) { canvas.drawBitmap(scaled, 0, 0, null); learnMode(canvas); } 使用这个处理程序可以吗?我现在正在尝试在我的代码中实现它...
【解决方案3】:

根据 cmets 的要求,这里有一个示例,说明如何使用 Handler 延迟运行某些代码,直到经过一定时间。将处理程序定义为 Activity 中的变量:

Handler handler = new Handler();

由于该处理程序是在 UI 线程上创建的,因此您发布到它的任何内容也将在同一线程上运行。您可以安排代码立即运行或延迟运行。例如:

handler.postDelayed(new Runnable()
{
    public void run()
    {
        //Your code here
    }
}, 3000);   //Code will be scheduled to run on the UI thread afer 3 seconds

【讨论】:

    猜你喜欢
    • 2018-05-08
    • 1970-01-01
    • 1970-01-01
    • 2019-01-12
    • 1970-01-01
    • 1970-01-01
    • 2023-02-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多