如何为我的线程处理程序方法设置超时?

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) 方法调用将设置 Threadinterrupted 标志。
现在,维护您已有的代码,您可能只想替换

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);