簡體   English   中英

如何為我的線程處理程序方法設置超時?

[英]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是更好的選擇,因為它返回一個可以canceledFuture<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)方法調用將設置Threadinterrupted標志。
現在,維護您已有的代碼,您可能只想替換

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM