Java BT芯片周期性心跳信息的处理

Java BT芯片周期性心跳信息的处理,java,android,multithreading,Java,Android,Multithreading,我对java非常陌生,我的任务是实现心跳机制来监控BT芯片的有效性 BT芯片每隔5秒通过uart接口发送一条空消息(只有消息ID,没有内容),java模块必须读取该消息。如果没有收到该消息,则假设芯片上的固件已失效,需要重置,java模块可以通过切换GPIO来完成重置 负责从uart读取的模块实现为扩展线程的类。我试过使用android.os.CountdownTimer,但不起作用。它抛出以下错误: AndroidRuntime:java.lang.RuntimeException:无法在未调

我对java非常陌生,我的任务是实现心跳机制来监控BT芯片的有效性

BT芯片每隔5秒通过uart接口发送一条空消息(只有消息ID,没有内容),java模块必须读取该消息。如果没有收到该消息,则假设芯片上的固件已失效,需要重置,java模块可以通过切换GPIO来完成重置

负责从uart读取的模块实现为扩展线程的类。我试过使用android.os.CountdownTimer,但不起作用。它抛出以下错误:

AndroidRuntime:java.lang.RuntimeException:无法在未调用Looper.prepare()的线程内创建处理程序。

java中实现这种需求的最佳机制是什么

/*Start timer for 5s for receiving heartbeat*/
mTimer=new CountDownTimer(5000,1000) {
    @Override
    public void onTick ( long l){
    }

    @Override
    public void onFinish () {
        Log.e(TAG, "Nothing received for 5s, missed heartbeat, reset BT chip");
        try {
            resetBTChip(false);
        } catch (InterruptedException e) {
            Log.e(TAG, "Can't reset the chip");
            return;
        }
    }
};

mTimer.start();

/*Check the message and deal with timer*/
if(HEART_BEAT.getCode()==opcode) {
    mTimer.cancel(); /*Restart the timer on heart-beat event*/
    mTimer.start();
    Log.e(TAG, "Got HEART BEAT");
    continue;
} else {
    Log.e(TAG, "Got Something else, handle the message");
    mTimer.cancel(); /*Restart the timer on any event*/
    mTimer.start();
}

您可以执行runnable和handler。处理程序有一个postdelay函数,允许您指定在运行runnable之前等待多长时间。它们还可以删除/取消计时器。我以前就是这样做心跳的。如果倒计时不起作用,你可以试试

因此runnable将负责重置函数。你应该用你现在的计时器。如果您再次获得心跳信号,您只需取消当前的runnable,并将其与postdelay函数一起添加回去以重新启动计时器