在 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)
}
@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)
}