【问题标题】:how to cancel timer and handler with stopping their proccess?如何通过停止进程来取消计时器和处理程序?
【发布时间】:2015-07-24 19:42:36
【问题描述】:

我想用内部处理程序停止当前的计时器进程,但是当我运行 mTimer.cancel() 时,我正在终止计时器实例,但 mHandler 及其进程继续它们的动作。我尝试使用 mHandler.removeCallbacks() 但效果不佳。

    mTimer.scheduleAtFixedRate(new TimerTask() {
        @Override
        public void run() {
            Log.e(TAG, "scan started");
            mScanning = true;
            mBluetoothAdapter.startLeScan(mLeScanCallback);
            mHandler.postDelayed(new Runnable() {
                @Override
                public void run() {

                    triggerListener();
                    Log.e(TAG, "scan stopped");
                    mScanning = false;
                    mBluetoothAdapter.stopLeScan(mLeScanCallback);
                }
            }, scanPeriod);
        }
    }, new Date(), betweenScanPeriod + scanPeriod);

【问题讨论】:

标签: android timer android-handler


【解决方案1】:

removeCallback() 方法不会停止当前正在运行的可运行对象,如 documentation 中所述:

删除消息队列中 Runnable r 的所有待处理帖子

当 runnable 正在执行时,它不再处于挂起/在消息队列中,因此无法从外部取消它。正如@Opiatefuchs 所说,您需要获取对发布可运行对象的处理程序的引用并向其发送消息:

Handler mHandler = new Handler();
Message message = mHandler.obtainMessage();
mHandler.sendMessage(message);

在处理程序中,您将覆盖handleMessage() 并通过设置一些将尽快停止它的变量来停止runnable。这意味着可运行对象和处理程序都必须共享至少一个变量。您可以在此post 中找到更多信息。

【讨论】:

    【解决方案2】:

    您需要保留对您发布的Runnable 的引用并将其删除

        Runnable runnable = new Runnable() {
            @Override
            public void run() {
                triggerListener();
                Log.e(TAG, "scan stopped");
                mScanning = false;
                mBluetoothAdapter.stopLeScan(mLeScanCallback);
            }
        };
    
    
    // And cancel it
    mHandler.removeCallbacks(runnable);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-07-11
      • 1970-01-01
      • 2021-12-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-12
      相关资源
      最近更新 更多