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

时间:2019-02-24 10:16:12

标签: java android handler

这是我的函数,每隔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的值消失了,请向用户敬酒它出了问题,然后重试

2 个答案:

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