在 Java 中重启 handler.postDelayed

Restart a handler.postDelayed in Java

@Override
public void onUserInteraction() {
    Handler handler = new Handler();
    handler.postDelayed(new Runnable () {
        public void run() {
            finish();
        }
    }, 5000);
    handler.removeCallbacks(null);
}

我正在尝试 运行 调用 OnCreate 方法时的处理程序。然后我想取消处理程序并在收到用户交互时再次调用它(重新启动处理程序)。

我该怎么做?

提前致谢

您可以使用布尔对象,例如:

@Override
public void onUserInteraction() {
    isStarted = true;
    Handler handler = new Handler();
    handler.postDelayed(new Runnable () {
        public void run() {
          if(isStarted){
            finish();
            }
         }
    }, 5000);

}

或者你可以做这样的事情:

Runnable myRunnable = new Runnable() {
    @Override
    public void run() {
        finish();
    }
};

public static Handler myHandler = new Handler();
private static final int TIME_TO_WAIT = 5000;

@Override
public void onUserInteraction() {
    restart();
}

public void start() {
    myHandler.postDelayed(myRunnable, TIME_TO_WAIT);
}

public void stop() {
    myHandler.removeCallbacks(myRunnable);
}

public void restart() {
    myHandler.removeCallbacks(myRunnable);
    myHandler.postDelayed(myRunnable, TIME_TO_WAIT);
}

将可运行对象和处理程序存储在字段中并重复使用它们

Handler handler;
Runnable runnable = new Runnable () {
    public void run() {
        finish();
    }
};

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    handler = new Handler();
    handler.postDelayed(runnable, 5000);
}

@Override
public void onUserInteraction() {
    handler.removeCallbacks(null);
    handler.postDelayed(runnable, 5000);
}

创建处理程序并将其引用保留为全局变量

private Runnable runnable;
private Handler newHandler;

newHandler = new Handler();
runnable = new Runnable() {
    @Override
    public void run() {
        try {
            //update UI
            newHandler.postDelayed(runnable,100);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
};
newHandler.post(runnable);

以及用户互动

@Override
public void onUserInteraction() {
    super.onUserInteraction();
   newHandler.removeCallbacks(runnable);
    //Do some task
    if(//task done){
     newHandler.postDelayed(runnable,100);
     }
}

在我使用 Handler 的 removeCallbacksAndMessages(Object token) 方法之前,它对我不起作用。

关于科特林

private var restartingHandler = Handler()
private var runnable: () -> Unit = {}

fun start() {
    restartingHandler.postDelayed(runnable, 5000L)
}

fun restart() {
    restartingHandler.removeCallbacks(runnable)
    restartingHandler.removeCallbacksAndMessages(null)

    restartingHandler.postDelayed(runnable, 5000L)
}

fun stop() {
    restartingHandler.removeCallbacks(runnable)
    restartingHandler.removeCallbacksAndMessages(null)
}