如何为我的线程Handler方法设置超时?

问题描述 投票:1回答:2

这是我的函数,每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的值应该消失并且向用户吐出一些出错的地方并再次尝试

java android handler
2个回答
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);

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

while (continue_or_stop)

while (!Thread.currentThread().isInterrupted())

根据您的需求调整。

© www.soinside.com 2019 - 2024. All rights reserved.