[英]How set a timeout for my thread Handler method?
這是我的函數,它每 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 時,我想暫停此方法,並將其 Toast 向用戶表示出現問題並重試
顯然,這更面向 Android,但我會籠統地回答。 而另一個答案似乎缺少“12 秒”超時。
好吧,您不能真正立即或強行終止Thread
。 把一個Thread
一個人,你需要善意地請求他終止他正在做的事情。 如果他能夠做到這一點,他將終止,否則他將繼續執行其任務。
在構建任務的實現時,您可以使用特殊標志檢查是否有人要求您終止
Thread#isInterrupted()
現在,對於這種事情,使用ExecutorService
是更好的選擇,因為它返回一個可以canceled
的Future<T>
。 例如
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)
方法調用將設置Thread
的interrupted
標志。
現在,維護您已有的代碼,您可能只想替換
while (continue_or_stop)
和
while (!Thread.currentThread().isInterrupted())
根據您的需要進行調整。
您可以根據試驗次數檢查超時。 使用 thread 和Thread.sleep
來運行周期性任務也不是一個好習慣。
要運行周期性任務,您可以使用postDelayed
方法將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);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.