这是我的函数,每隔2.5秒运行一次代码,并检查是否将设置为true的值我的进度消失了...
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的值消失了,请向用户敬酒它出了问题,然后重试
答案 0 :(得分:1)
显然,这是更多面向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
的{{1}}标志。
现在,维护已有的代码,您可能只想替换
Thread
使用
while (continue_or_stop)
根据需要进行调整。
答案 1 :(得分:1)
您可以根据试验次数检查超时。另外,使用线程和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);