这是我的函数,每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秒)进度之后未设置为true的值应该消失并且向用户吐出一些出错的地方并再次尝试
您可以根据试验次数检查超时。使用线程和Thread.sleep
来运行周期性任务也不是一个好习惯。
要运行周期性任务,您可以使用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);
显然这更像Android,但我会回答一般性的问题。另一个答案似乎缺少“12秒”超时。
好吧,你不能立即或强制终止Thread
。考虑像一个人一样的Thread
,你需要请他终止他正在做的事情。如果他能够做到这一点,他将终止,否则他将继续其任务。
当您构建任务的实现时,您可以使用特殊标志检查是否有人要求您终止
Thread#isInterrupted()
现在,对于这种使用ExecutorService
的东西是更好的选择,因为它返回Future<T>
,可以是canceled
。例如。
final ExecutorService executorService = ExecutorService.newSingleThreadExecutor();
final Future<?> future = executorService.submit(runnable);
然后你可以对Future
说“我想要结果(在你的情况下是什么都没有),但是超时”
try {
future.get(12, TimeUnit.SECONDS);
} catch (final TimeoutException e) {
future.cancel(true);
}
cancel(true)
方法调用将设置interrupted
的Thread
标志。
现在,维护已有的代码,您可能只想替换
while (continue_or_stop)
同
while (!Thread.currentThread().isInterrupted())
根据您的需求调整。