如何为我的线程处理程序方法设置超时?
How set a timeout for my thread Handler method?
这是我的功能,每 2.5 秒 运行 一个代码,并检查设置为真值的值是否会消失,并且...
mHandler = new Handler();
continue_or_stop = true;
new Thread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
while (continue_or_stop) {
try {
Thread.sleep(2500); // every 2.5 seconds
mHandler.post(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
if (sp.getFromPreferences("state_update").equals("true")) {
progress_main.setVisibility(View.GONE);
layout_main.setVisibility(View.VISIBLE);
btn_save_send.setVisibility(View.GONE);
getOutputs();
MDToast.makeText(getActivity(), "وضعیت دستگاه با موفقیت بروزرسانی شد", Toast.LENGTH_LONG, MDToast.TYPE_SUCCESS).show();
sp.saveToPreferences("state_update", "false");
Intent intent = new Intent(getContext(), MainActivity.class);
startActivity(intent);
}
// you can set continue_or_stop to false, for stop
}
});
} catch (Exception e) {
// TODO: handle exception
}
}
}
}).start();
现在,如果在(例如 12 秒)进度后该值未设置为真,我希望此方法超时,并向用户敬酒,说明出现问题并重试
显然这更 Android 导向,但我会笼统地回答。另一个答案似乎缺少“12 秒”超时。
好吧,您不能立即或强制终止 Thread
。考虑一个Thread
喜欢的人,你需要善意地请求他终止他正在做的事情。如果他能够做到这一点,他将终止,否则他将继续其任务。
当您构建任务的实现时,您可以检查是否有人要求您使用特殊标志终止
Thread#isInterrupted()
现在,对于这种情况,使用 ExecutorService
是更好的选择,因为它 returns 和 Future<T>
可以是 canceled
。例如
final ExecutorService executorService = ExecutorService.newSingleThreadExecutor();
final Future<?> future = executorService.submit(runnable);
然后你可以对Future
"I want the result (which in your case is nothing), but with a timeout"
说
try {
future.get(12, TimeUnit.SECONDS);
} catch (final TimeoutException e) {
future.cancel(true);
}
cancel(true)
方法调用将设置 Thread
的 interrupted
标志。
现在,维护您已有的代码,您可能只想替换
while (continue_or_stop)
和
while (!Thread.currentThread().isInterrupted())
根据您的需要进行调整。
您可以根据试玩次数来判断是否超时。此外,使用线程和 Thread.sleep
执行周期性任务 运行 也不是一个好习惯。
到运行一个周期性任务,你可以post一个Runnable
到一个Handler
,使用postDelayed
方法有一些延迟。
private Handler mHandler = new Handler();
private int mTrials = 0;
private Runnable mPeriodicTask = new Runnable() {
public void run() {
// Do the check
mTrials += 1;
if (mTrials == /* timeout number */) {
// timeout
} else {
mHandler.postDelayed(this, 2500);
}
}
}
要运行任务:
mHandler.postDelayed(mPeriodicTask, 2500);
这是我的功能,每 2.5 秒 运行 一个代码,并检查设置为真值的值是否会消失,并且...
mHandler = new Handler();
continue_or_stop = true;
new Thread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
while (continue_or_stop) {
try {
Thread.sleep(2500); // every 2.5 seconds
mHandler.post(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
if (sp.getFromPreferences("state_update").equals("true")) {
progress_main.setVisibility(View.GONE);
layout_main.setVisibility(View.VISIBLE);
btn_save_send.setVisibility(View.GONE);
getOutputs();
MDToast.makeText(getActivity(), "وضعیت دستگاه با موفقیت بروزرسانی شد", Toast.LENGTH_LONG, MDToast.TYPE_SUCCESS).show();
sp.saveToPreferences("state_update", "false");
Intent intent = new Intent(getContext(), MainActivity.class);
startActivity(intent);
}
// you can set continue_or_stop to false, for stop
}
});
} catch (Exception e) {
// TODO: handle exception
}
}
}
}).start();
现在,如果在(例如 12 秒)进度后该值未设置为真,我希望此方法超时,并向用户敬酒,说明出现问题并重试
显然这更 Android 导向,但我会笼统地回答。另一个答案似乎缺少“12 秒”超时。
好吧,您不能立即或强制终止 Thread
。考虑一个Thread
喜欢的人,你需要善意地请求他终止他正在做的事情。如果他能够做到这一点,他将终止,否则他将继续其任务。
当您构建任务的实现时,您可以检查是否有人要求您使用特殊标志终止
Thread#isInterrupted()
现在,对于这种情况,使用 ExecutorService
是更好的选择,因为它 returns 和 Future<T>
可以是 canceled
。例如
final ExecutorService executorService = ExecutorService.newSingleThreadExecutor();
final Future<?> future = executorService.submit(runnable);
然后你可以对Future
"I want the result (which in your case is nothing), but with a timeout"
try {
future.get(12, TimeUnit.SECONDS);
} catch (final TimeoutException e) {
future.cancel(true);
}
cancel(true)
方法调用将设置 Thread
的 interrupted
标志。
现在,维护您已有的代码,您可能只想替换
while (continue_or_stop)
和
while (!Thread.currentThread().isInterrupted())
根据您的需要进行调整。
您可以根据试玩次数来判断是否超时。此外,使用线程和 Thread.sleep
执行周期性任务 运行 也不是一个好习惯。
到运行一个周期性任务,你可以post一个Runnable
到一个Handler
,使用postDelayed
方法有一些延迟。
private Handler mHandler = new Handler();
private int mTrials = 0;
private Runnable mPeriodicTask = new Runnable() {
public void run() {
// Do the check
mTrials += 1;
if (mTrials == /* timeout number */) {
// timeout
} else {
mHandler.postDelayed(this, 2500);
}
}
}
要运行任务:
mHandler.postDelayed(mPeriodicTask, 2500);