【问题标题】:Calling Handler.Postdelayed periodically in a Thread在线程中定期调用 Handler.Postdelayed
【发布时间】:2016-07-13 08:31:36
【问题描述】:

我有一个监听蓝牙串行数据的线程。

我有一个将数据传递给ui线程的方法,叫做:sendData(byte[] buffer),它将数据完美地发送到ui线程,这会导致它在高频接收数据包时变得非常慢。

但我想实现一个周期性处理程序,它每 x 毫秒调用一次此 sendData 方法,因为我以高频率接收数据包。

在我的线程中,我在run() 中调用了以下内容 方法:

Looper.prepare;
mHandler = new Handler();

然后我将sendData(buffer)(它本身做得很完美)与:

mHandler.postDelayed(new Runnable() {
                       @Override
                        public void run() {
                            sendData(tmp);
                            System.out.println("PostDelayed| "+ System.currentTimeMillis());

                             mHandler.postDelayed(this,INTERVAL);

                        }
                    },INTERVAL);

Interval 是预先声明的,其中将是调用该方法的周期性间隔。

但是 postDelayed 的运行没有被调用。我尝试调试,调用了 postdelayeds 行,但它以 'No such instance field mHandler' 退出。

有什么想法吗?

【问题讨论】:

  • 可能没有mHandler这样的实例字段。
  • 但这意味着什么?
  • 首先,mHandler 是什么?它在哪里声明?
  • 在Thread中声明并在Threads first run()中初始化

标签: java android multithreading bluetooth android-handler


【解决方案1】:

我建议使用 ScheduledExecutorService。请参阅docs

它具有 scheduleAtFixedRate 方法,您可以使用它来安排定期操作。在您传递它的可运行文件中,使用您的 sendData(tmp) 命令调用 mHandler.post()。

【讨论】:

  • 我设法实现了它,但是我无法根据我的间隔(1000)和 scheduleatfixedrate 方法中的 TimeUnit.Milliseconds 来安排它。
  • 您是否尝试使用值 1L 和 TimeUnit.SECONDS 代替?
  • 是的,但没有成功,它会在没有期间不断调用。
  • 您确定,您不会在调用 scheduleAtFixedRate / scheduleWithFixedDelay 时将 'initialDelay' 参数与 'period' 混淆吗?
  • 我将相同的参数传递给他们两个。我认为这可能是一个问题,因为我从一个线程调用它,但是当从主要活动调用进行测试时它是相同的,周期根本不工作......没有延迟。我需要弄清楚其他事情。
猜你喜欢
  • 2011-05-21
  • 1970-01-01
  • 1970-01-01
  • 2017-06-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多