处理程序后执行队列顺序不正确 [英] Handler post execute queue not in correct order

查看:83
本文介绍了处理程序后执行队列顺序不正确的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在与蓝牙BLE设备(具有针对我们产品开发的自定义协议)进行通信的android应用程序上工作.

连接到设备后,我有回调public void onCharacteristicChanged(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic) 每次设备要向我发送数据时都会触发. 在应用程序体系结构中,我们有操作(例如getDeviceStatus()),该协议按以下方式工作:电话连接到设备->进行握手->发送命令(以字节为单位)->设备以命令响应(确定/不确定)- >,现在设备开始发送X byte[]块. 因此,请确保我们以正确的顺序处理数据,并且不会因我添加了HandlerThread:

的不同线程而混乱

HandlerThread handlerThread = new HandlerThread("ActionHandlerThread");
      handlerThread.start();
      Looper looper = handlerThread.getLooper();
      mHandler = new Handler(looper);

每次设备发送数据时我都会呼叫

@Override
 public void onCharacteristicChanged(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic) {
    mHandler.post(() -> {
        mListener.onCharacteristicChanged(gatt, characteristic);
        }
    );  
 }

mListener将数据发送给其他类,这些类检查到达的数据类型和期望的数据. 如果我每次调用post()都理解正确,则会将新任务添加到处理程序的循环程序中,并应按照与添加它们相同的顺序来处理该任务,但是当我在日志中运行该应用程序时,我会看到回调已正确触发并发布了)的调用顺序正确,但随后的处理顺序错误. 例如,应用程序希望接收到确认命令,但是数据已经来了,但这是不可能的,因为数据不能在确认之前来. 我创建HandlerThread的主要原因是确保使用BLE的整个操作将在单个线程上运行,并且不必担心同步问题,但是现在看来我确实存在同步问题. 我想念一些逻辑或对HandlerThread的理解吗?

我仅使用计时器和计数器进行的一些测试,我们可以看到,当间隔小至1毫秒时,并非所有任务都打印在帖子中:

5毫秒的间隔:

2019-01-30 21:33:31.531 27991-27991/? D/ThreadTest: Thread before Thread[main,5,main]
2019-01-30 21:33:31.532 27991-28036/? D/ThreadTest: Counter : 1 , Thread[Timer-0,5,main]
2019-01-30 21:33:31.532 27991-28035/? D/ThreadTest: Counter : 1 , inside post Thread[MyTestThread,5,main]
2019-01-30 21:33:31.537 27991-28036/? D/ThreadTest: Counter : 2 , Thread[Timer-0,5,main]
2019-01-30 21:33:31.538 27991-28035/? D/ThreadTest: Counter : 2 , inside post Thread[MyTestThread,5,main]
2019-01-30 21:33:31.543 27991-28036/? D/ThreadTest: Counter : 3 , Thread[Timer-0,5,main]
2019-01-30 21:33:31.543 27991-28035/? D/ThreadTest: Counter : 3 , inside post Thread[MyTestThread,5,main]
2019-01-30 21:33:31.548 27991-28036/? D/ThreadTest: Counter : 4 , Thread[Timer-0,5,main]
2019-01-30 21:33:31.548 27991-28035/? D/ThreadTest: Counter : 4 , inside post Thread[MyTestThread,5,main]
2019-01-30 21:33:31.553 27991-28036/? D/ThreadTest: Counter : 5 , Thread[Timer-0,5,main]
2019-01-30 21:33:31.553 27991-28035/? D/ThreadTest: Counter : 5 , inside post Thread[MyTestThread,5,main]
2019-01-30 21:33:31.559 27991-28036/? D/ThreadTest: Counter : 6 , Thread[Timer-0,5,main]
2019-01-30 21:33:31.559 27991-28035/? D/ThreadTest: Counter : 6 , inside post Thread[MyTestThread,5,main]
2019-01-30 21:33:31.563 27991-28036/? D/ThreadTest: Counter : 7 , Thread[Timer-0,5,main]
2019-01-30 21:33:31.563 27991-28035/? D/ThreadTest: Counter : 7 , inside post Thread[MyTestThread,5,main]
2019-01-30 21:33:31.568 27991-28036/? D/ThreadTest: Counter : 8 , Thread[Timer-0,5,main]
2019-01-30 21:33:31.569 27991-28035/? D/ThreadTest: Counter : 8 , inside post Thread[MyTestThread,5,main]
2019-01-30 21:33:31.574 27991-28036/? D/ThreadTest: Counter : 9 , Thread[Timer-0,5,main]
2019-01-30 21:33:31.574 27991-28035/? D/ThreadTest: Counter : 9 , inside post Thread[MyTestThread,5,main]
2019-01-30 21:33:31.580 27991-28036/? D/ThreadTest: Counter : 10 , Thread[Timer-0,5,main]
2019-01-30 21:33:31.580 27991-28035/? D/ThreadTest: Counter : 10 , inside post Thread[MyTestThread,5,main]
2019-01-30 21:33:31.585 27991-28036/? D/ThreadTest: Counter : 11 , Thread[Timer-0,5,main]
2019-01-30 21:33:31.586 27991-28035/? D/ThreadTest: Counter : 11 , inside post Thread[MyTestThread,5,main]
2019-01-30 21:33:31.591 27991-28036/? D/ThreadTest: Counter : 12 , Thread[Timer-0,5,main]
2019-01-30 21:33:31.591 27991-28035/? D/ThreadTest: Counter : 12 , inside post Thread[MyTestThread,5,main]
2019-01-30 21:33:31.596 27991-28036/? D/ThreadTest: Counter : 13 , Thread[Timer-0,5,main]
2019-01-30 21:33:31.596 27991-28035/? D/ThreadTest: Counter : 13 , inside post Thread[MyTestThread,5,main]
2019-01-30 21:33:31.602 27991-28036/? D/ThreadTest: Counter : 14 , Thread[Timer-0,5,main]
2019-01-30 21:33:31.604 27991-28035/? D/ThreadTest: Counter : 14 , inside post Thread[MyTestThread,5,main]
2019-01-30 21:33:31.607 27991-28036/? D/ThreadTest: Counter : 15 , Thread[Timer-0,5,main]
2019-01-30 21:33:31.607 27991-28035/? D/ThreadTest: Counter : 15 , inside post Thread[MyTestThread,5,main]
2019-01-30 21:33:31.612 27991-28036/? D/ThreadTest: Counter : 16 , Thread[Timer-0,5,main]
2019-01-30 21:33:31.613 27991-28035/? D/ThreadTest: Counter : 16 , inside post Thread[MyTestThread,5,main]
2019-01-30 21:33:31.618 27991-28036/? D/ThreadTest: Counter : 17 , Thread[Timer-0,5,main]
2019-01-30 21:33:31.618 27991-28035/? D/ThreadTest: Counter : 17 , inside post Thread[MyTestThread,5,main]
2019-01-30 21:33:31.623 27991-28036/? D/ThreadTest: Counter : 18 , Thread[Timer-0,5,main]
2019-01-30 21:33:31.623 27991-28035/? D/ThreadTest: Counter : 18 , inside post Thread[MyTestThread,5,main]
2019-01-30 21:33:31.628 27991-28036/? D/ThreadTest: Counter : 19 , Thread[Timer-0,5,main]
2019-01-30 21:33:31.629 27991-28035/? D/ThreadTest: Counter : 19 , inside post Thread[MyTestThread,5,main]
2019-01-30 21:33:31.633 27991-28036/? D/ThreadTest: Counter : 20 , Thread[Timer-0,5,main]
2019-01-30 21:33:31.633 27991-28035/? D/ThreadTest: Counter : 20 , inside post Thread[MyTestThread,5,main]
2019-01-30 21:33:31.638 27991-28036/? D/ThreadTest: Counter : 21 , Thread[Timer-0,5,main]
2019-01-30 21:33:31.639 27991-28035/? D/ThreadTest: Counter : 21 , inside post Thread[MyTestThread,5,main]
2019-01-30 21:33:31.643 27991-28036/? D/ThreadTest: Counter : 22 , Thread[Timer-0,5,main]
2019-01-30 21:33:31.643 27991-28035/? D/ThreadTest: Counter : 22 , inside post Thread[MyTestThread,5,main]
2019-01-30 21:33:31.648 27991-28036/? D/ThreadTest: Counter : 23 , Thread[Timer-0,5,main]
2019-01-30 21:33:31.648 27991-28035/? D/ThreadTest: Counter : 23 , inside post Thread[MyTestThread,5,main]
2019-01-30 21:33:31.654 27991-28036/? D/ThreadTest: Counter : 24 , Thread[Timer-0,5,main]
2019-01-30 21:33:31.654 27991-28035/? D/ThreadTest: Counter : 24 , inside post Thread[MyTestThread,5,main]
2019-01-30 21:33:31.659 27991-28036/? D/ThreadTest: Counter : 25 , Thread[Timer-0,5,main]
2019-01-30 21:33:31.659 27991-28035/? D/ThreadTest: Counter : 25 , inside post Thread[MyTestThread,5,main]
2019-01-30 21:33:31.665 27991-28036/? D/ThreadTest: Counter : 26 , Thread[Timer-0,5,main]
2019-01-30 21:33:31.665 27991-28035/? D/ThreadTest: Counter : 26 , inside post Thread[MyTestThread,5,main]
2019-01-30 21:33:31.669 27991-28036/? D/ThreadTest: Counter : 27 , Thread[Timer-0,5,main]
2019-01-30 21:33:31.669 27991-28035/? D/ThreadTest: Counter : 27 , inside post Thread[MyTestThread,5,main]
2019-01-30 21:33:31.674 27991-28036/? D/ThreadTest: Counter : 28 , Thread[Timer-0,5,main]
2019-01-30 21:33:31.675 27991-28035/? D/ThreadTest: Counter : 28 , inside post Thread[MyTestThread,5,main]
2019-01-30 21:33:31.679 27991-28036/? D/ThreadTest: Counter : 29 , Thread[Timer-0,5,main]
2019-01-30 21:33:31.679 27991-28035/? D/ThreadTest: Counter : 29 , inside post Thread[MyTestThread,5,main]
2019-01-30 21:33:31.684 27991-28036/? D/ThreadTest: Counter : 30 , Thread[Timer-0,5,main]
2019-01-30 21:33:31.684 27991-28035/? D/ThreadTest: Counter : 30 , inside post Thread[MyTestThread,5,main]
2019-01-30 21:33:31.690 27991-28036/? D/ThreadTest: Counter : 31 , Thread[Timer-0,5,main]
2019-01-30 21:33:31.690 27991-28035/? D/ThreadTest: Counter : 31 , inside post Thread[MyTestThread,5,main]
2019-01-30 21:33:31.694 27991-28036/? D/ThreadTest: Counter : 32 , Thread[Timer-0,5,main]
2019-01-30 21:33:31.694 27991-28035/? D/ThreadTest: Counter : 32 , inside post Thread[MyTestThread,5,main]
2019-01-30 21:33:31.700 27991-28036/? D/ThreadTest: Counter : 33 , Thread[Timer-0,5,main]
2019-01-30 21:33:31.700 27991-28035/? D/ThreadTest: Counter : 33 , inside post Thread[MyTestThread,5,main]
2019-01-30 21:33:31.704 27991-28036/? D/ThreadTest: Counter : 34 , Thread[Timer-0,5,main]
2019-01-30 21:33:31.704 27991-28035/? D/ThreadTest: Counter : 34 , inside post Thread[MyTestThread,5,main]
2019-01-30 21:33:31.709 27991-28036/? D/ThreadTest: Counter : 35 , Thread[Timer-0,5,main]
2019-01-30 21:33:31.709 27991-28035/? D/ThreadTest: Counter : 35 , inside post Thread[MyTestThread,5,main]
2019-01-30 21:33:31.715 27991-28036/? D/ThreadTest: Counter : 36 , Thread[Timer-0,5,main]
2019-01-30 21:33:31.715 27991-28035/? D/ThreadTest: Counter : 36 , inside post Thread[MyTestThread,5,main]
2019-01-30 21:33:31.719 27991-28036/? D/ThreadTest: Counter : 37 , Thread[Timer-0,5,main]
2019-01-30 21:33:31.719 27991-28035/? D/ThreadTest: Counter : 37 , inside post Thread[MyTestThread,5,main]
2019-01-30 21:33:31.724 27991-28036/? D/ThreadTest: Counter : 38 , Thread[Timer-0,5,main]
2019-01-30 21:33:31.724 27991-28035/? D/ThreadTest: Counter : 38 , inside post Thread[MyTestThread,5,main]
2019-01-30 21:33:31.730 27991-28036/? D/ThreadTest: Counter : 39 , Thread[Timer-0,5,main]
2019-01-30 21:33:31.730 27991-28035/? D/ThreadTest: Counter : 39 , inside post Thread[MyTestThread,5,main]
2019-01-30 21:33:31.735 27991-28036/? D/ThreadTest: Counter : 40 , Thread[Timer-0,5,main]
2019-01-30 21:33:31.735 27991-28035/? D/ThreadTest: Counter : 40 , inside post Thread[MyTestThread,5,main]
2019-01-30 21:33:31.740 27991-28036/? D/ThreadTest: Counter : 41 , Thread[Timer-0,5,main]
2019-01-30 21:33:31.741 27991-28035/? D/ThreadTest: Counter : 41 , inside post Thread[MyTestThread,5,main]
2019-01-30 21:33:31.745 27991-28036/? D/ThreadTest: Counter : 42 , Thread[Timer-0,5,main]
2019-01-30 21:33:31.746 27991-28035/? D/ThreadTest: Counter : 42 , inside post Thread[MyTestThread,5,main]
2019-01-30 21:33:31.750 27991-28036/? D/ThreadTest: Counter : 43 , Thread[Timer-0,5,main]
2019-01-30 21:33:31.750 27991-28035/? D/ThreadTest: Counter : 43 , inside post Thread[MyTestThread,5,main]
2019-01-30 21:33:31.756 27991-28036/? D/ThreadTest: Counter : 44 , Thread[Timer-0,5,main]
2019-01-30 21:33:31.756 27991-28035/? D/ThreadTest: Counter : 44 , inside post Thread[MyTestThread,5,main]
2019-01-30 21:33:31.760 27991-28036/? D/ThreadTest: Counter : 45 , Thread[Timer-0,5,main]
2019-01-30 21:33:31.760 27991-28035/? D/ThreadTest: Counter : 45 , inside post Thread[MyTestThread,5,main]
2019-01-30 21:33:31.765 27991-28036/? D/ThreadTest: Counter : 46 , Thread[Timer-0,5,main]
2019-01-30 21:33:31.765 27991-28035/? D/ThreadTest: Counter : 46 , inside post Thread[MyTestThread,5,main]
2019-01-30 21:33:31.771 27991-28036/? D/ThreadTest: Counter : 47 , Thread[Timer-0,5,main]
2019-01-30 21:33:31.771 27991-28035/? D/ThreadTest: Counter : 47 , inside post Thread[MyTestThread,5,main]
2019-01-30 21:33:31.775 27991-28036/? D/ThreadTest: Counter : 48 , Thread[Timer-0,5,main]
2019-01-30 21:33:31.775 27991-28035/? D/ThreadTest: Counter : 48 , inside post Thread[MyTestThread,5,main]
2019-01-30 21:33:31.780 27991-28036/? D/ThreadTest: Counter : 49 , Thread[Timer-0,5,main]
2019-01-30 21:33:31.780 27991-28035/? D/ThreadTest: Counter : 49 , inside post Thread[MyTestThread,5,main]
2019-01-30 21:33:31.785 27991-28036/? D/ThreadTest: Counter : 50 , Thread[Timer-0,5,main]
2019-01-30 21:33:31.786 27991-28035/? D/ThreadTest: Counter : 50 , inside post Thread[MyTestThread,5,main]

间隔1毫秒:

2019-01-30 21:32:57.104 27831-27831/? D/ThreadTest: Thread before Thread[main,5,main]
2019-01-30 21:32:57.105 27831-27866/? D/ThreadTest: Counter : 1 , Thread[Timer-0,5,main]
2019-01-30 21:32:57.106 27831-27865/? D/ThreadTest: Counter : 1 , inside post Thread[MyTestThread,5,main]
2019-01-30 21:32:57.107 27831-27866/? D/ThreadTest: Counter : 2 , Thread[Timer-0,5,main]
2019-01-30 21:32:57.107 27831-27865/? D/ThreadTest: Counter : 2 , inside post Thread[MyTestThread,5,main]
2019-01-30 21:32:57.109 27831-27866/? D/ThreadTest: Counter : 3 , Thread[Timer-0,5,main]
2019-01-30 21:32:57.110 27831-27865/? D/ThreadTest: Counter : 3 , inside post Thread[MyTestThread,5,main]
2019-01-30 21:32:57.111 27831-27866/? D/ThreadTest: Counter : 4 , Thread[Timer-0,5,main]
2019-01-30 21:32:57.111 27831-27865/? D/ThreadTest: Counter : 4 , inside post Thread[MyTestThread,5,main]
2019-01-30 21:32:57.112 27831-27866/? D/ThreadTest: Counter : 5 , Thread[Timer-0,5,main]
2019-01-30 21:32:57.112 27831-27865/? D/ThreadTest: Counter : 5 , inside post Thread[MyTestThread,5,main]
2019-01-30 21:32:57.114 27831-27866/? D/ThreadTest: Counter : 6 , Thread[Timer-0,5,main]
2019-01-30 21:32:57.114 27831-27866/? D/ThreadTest: Counter : 7 , Thread[Timer-0,5,main]
2019-01-30 21:32:57.114 27831-27865/? D/ThreadTest: Counter : 7 , inside post Thread[MyTestThread,5,main]
2019-01-30 21:32:57.115 27831-27865/? D/ThreadTest: Counter : 7 , inside post Thread[MyTestThread,5,main]
2019-01-30 21:32:57.115 27831-27866/? D/ThreadTest: Counter : 8 , Thread[Timer-0,5,main]
2019-01-30 21:32:57.116 27831-27865/? D/ThreadTest: Counter : 8 , inside post Thread[MyTestThread,5,main]
2019-01-30 21:32:57.117 27831-27866/? D/ThreadTest: Counter : 9 , Thread[Timer-0,5,main]
2019-01-30 21:32:57.117 27831-27866/? D/ThreadTest: Counter : 10 , Thread[Timer-0,5,main]
2019-01-30 21:32:57.118 27831-27865/? D/ThreadTest: Counter : 10 , inside post Thread[MyTestThread,5,main]
2019-01-30 21:32:57.118 27831-27865/? D/ThreadTest: Counter : 11 , inside post Thread[MyTestThread,5,main]
2019-01-30 21:32:57.118 27831-27866/? D/ThreadTest: Counter : 11 , Thread[Timer-0,5,main]
2019-01-30 21:32:57.118 27831-27865/? D/ThreadTest: Counter : 11 , inside post Thread[MyTestThread,5,main]
2019-01-30 21:32:57.120 27831-27866/? D/ThreadTest: Counter : 12 , Thread[Timer-0,5,main]
2019-01-30 21:32:57.120 27831-27865/? D/ThreadTest: Counter : 12 , inside post Thread[MyTestThread,5,main]
2019-01-30 21:32:57.121 27831-27866/? D/ThreadTest: Counter : 13 , Thread[Timer-0,5,main]
2019-01-30 21:32:57.122 27831-27865/? D/ThreadTest: Counter : 13 , inside post Thread[MyTestThread,5,main]
2019-01-30 21:32:57.122 27831-27866/? D/ThreadTest: Counter : 14 , Thread[Timer-0,5,main]
2019-01-30 21:32:57.123 27831-27865/? D/ThreadTest: Counter : 14 , inside post Thread[MyTestThread,5,main]
2019-01-30 21:32:57.124 27831-27866/? D/ThreadTest: Counter : 15 , Thread[Timer-0,5,main]
2019-01-30 21:32:57.125 27831-27865/? D/ThreadTest: Counter : 15 , inside post Thread[MyTestThread,5,main]
2019-01-30 21:32:57.125 27831-27866/? D/ThreadTest: Counter : 16 , Thread[Timer-0,5,main]
2019-01-30 21:32:57.126 27831-27865/? D/ThreadTest: Counter : 16 , inside post Thread[MyTestThread,5,main]
2019-01-30 21:32:57.127 27831-27866/? D/ThreadTest: Counter : 17 , Thread[Timer-0,5,main]
2019-01-30 21:32:57.127 27831-27866/? D/ThreadTest: Counter : 18 , Thread[Timer-0,5,main]
2019-01-30 21:32:57.127 27831-27865/? D/ThreadTest: Counter : 18 , inside post Thread[MyTestThread,5,main]
2019-01-30 21:32:57.128 27831-27865/? D/ThreadTest: Counter : 18 , inside post Thread[MyTestThread,5,main]
2019-01-30 21:32:57.129 27831-27866/? D/ThreadTest: Counter : 19 , Thread[Timer-0,5,main]
2019-01-30 21:32:57.129 27831-27866/? D/ThreadTest: Counter : 20 , Thread[Timer-0,5,main]
2019-01-30 21:32:57.129 27831-27865/? D/ThreadTest: Counter : 20 , inside post Thread[MyTestThread,5,main]
2019-01-30 21:32:57.129 27831-27865/? D/ThreadTest: Counter : 20 , inside post Thread[MyTestThread,5,main]
2019-01-30 21:32:57.130 27831-27866/? D/ThreadTest: Counter : 21 , Thread[Timer-0,5,main]
2019-01-30 21:32:57.130 27831-27865/? D/ThreadTest: Counter : 21 , inside post Thread[MyTestThread,5,main]
2019-01-30 21:32:57.131 27831-27866/? D/ThreadTest: Counter : 22 , Thread[Timer-0,5,main]
2019-01-30 21:32:57.131 27831-27865/? D/ThreadTest: Counter : 22 , inside post Thread[MyTestThread,5,main]
2019-01-30 21:32:57.132 27831-27866/? D/ThreadTest: Counter : 23 , Thread[Timer-0,5,main]
2019-01-30 21:32:57.133 27831-27866/? D/ThreadTest: Counter : 24 , Thread[Timer-0,5,main]
2019-01-30 21:32:57.133 27831-27865/? D/ThreadTest: Counter : 24 , inside post Thread[MyTestThread,5,main]
2019-01-30 21:32:57.133 27831-27865/? D/ThreadTest: Counter : 24 , inside post Thread[MyTestThread,5,main]
2019-01-30 21:32:57.134 27831-27866/? D/ThreadTest: Counter : 25 , Thread[Timer-0,5,main]
2019-01-30 21:32:57.134 27831-27865/? D/ThreadTest: Counter : 25 , inside post Thread[MyTestThread,5,main]
2019-01-30 21:32:57.135 27831-27866/? D/ThreadTest: Counter : 26 , Thread[Timer-0,5,main]
2019-01-30 21:32:57.135 27831-27865/? D/ThreadTest: Counter : 26 , inside post Thread[MyTestThread,5,main]
2019-01-30 21:32:57.136 27831-27866/? D/ThreadTest: Counter : 27 , Thread[Timer-0,5,main]
2019-01-30 21:32:57.136 27831-27865/? D/ThreadTest: Counter : 27 , inside post Thread[MyTestThread,5,main]
2019-01-30 21:32:57.138 27831-27866/? D/ThreadTest: Counter : 28 , Thread[Timer-0,5,main]
2019-01-30 21:32:57.138 27831-27865/? D/ThreadTest: Counter : 28 , inside post Thread[MyTestThread,5,main]
2019-01-30 21:32:57.139 27831-27866/? D/ThreadTest: Counter : 29 , Thread[Timer-0,5,main]
2019-01-30 21:32:57.139 27831-27865/? D/ThreadTest: Counter : 29 , inside post Thread[MyTestThread,5,main]
2019-01-30 21:32:57.140 27831-27866/? D/ThreadTest: Counter : 30 , Thread[Timer-0,5,main]
2019-01-30 21:32:57.140 27831-27865/? D/ThreadTest: Counter : 30 , inside post Thread[MyTestThread,5,main]
2019-01-30 21:32:57.142 27831-27866/? D/ThreadTest: Counter : 31 , Thread[Timer-0,5,main]
2019-01-30 21:32:57.142 27831-27865/? D/ThreadTest: Counter : 31 , inside post Thread[MyTestThread,5,main]
2019-01-30 21:32:57.143 27831-27866/? D/ThreadTest: Counter : 32 , Thread[Timer-0,5,main]
2019-01-30 21:32:57.143 27831-27865/? D/ThreadTest: Counter : 32 , inside post Thread[MyTestThread,5,main]
2019-01-30 21:32:57.144 27831-27866/? D/ThreadTest: Counter : 33 , Thread[Timer-0,5,main]
2019-01-30 21:32:57.145 27831-27865/? D/ThreadTest: Counter : 33 , inside post Thread[MyTestThread,5,main]
2019-01-30 21:32:57.146 27831-27866/? D/ThreadTest: Counter : 34 , Thread[Timer-0,5,main]
2019-01-30 21:32:57.146 27831-27865/? D/ThreadTest: Counter : 34 , inside post Thread[MyTestThread,5,main]
2019-01-30 21:32:57.147 27831-27866/? D/ThreadTest: Counter : 35 , Thread[Timer-0,5,main]
2019-01-30 21:32:57.147 27831-27865/? D/ThreadTest: Counter : 35 , inside post Thread[MyTestThread,5,main]
2019-01-30 21:32:57.148 27831-27866/? D/ThreadTest: Counter : 36 , Thread[Timer-0,5,main]
2019-01-30 21:32:57.148 27831-27865/? D/ThreadTest: Counter : 36 , inside post Thread[MyTestThread,5,main]
2019-01-30 21:32:57.150 27831-27866/? D/ThreadTest: Counter : 37 , Thread[Timer-0,5,main]
2019-01-30 21:32:57.150 27831-27866/? D/ThreadTest: Counter : 38 , Thread[Timer-0,5,main]
2019-01-30 21:32:57.150 27831-27865/? D/ThreadTest: Counter : 38 , inside post Thread[MyTestThread,5,main]
2019-01-30 21:32:57.150 27831-27865/? D/ThreadTest: Counter : 38 , inside post Thread[MyTestThread,5,main]
2019-01-30 21:32:57.151 27831-27866/? D/ThreadTest: Counter : 39 , Thread[Timer-0,5,main]
2019-01-30 21:32:57.151 27831-27865/? D/ThreadTest: Counter : 39 , inside post Thread[MyTestThread,5,main]
2019-01-30 21:32:57.152 27831-27866/? D/ThreadTest: Counter : 40 , Thread[Timer-0,5,main]
2019-01-30 21:32:57.152 27831-27865/? D/ThreadTest: Counter : 40 , inside post Thread[MyTestThread,5,main]
2019-01-30 21:32:57.153 27831-27866/? D/ThreadTest: Counter : 41 , Thread[Timer-0,5,main]
2019-01-30 21:32:57.154 27831-27866/? D/ThreadTest: Counter : 42 , Thread[Timer-0,5,main]
2019-01-30 21:32:57.154 27831-27865/? D/ThreadTest: Counter : 42 , inside post Thread[MyTestThread,5,main]
2019-01-30 21:32:57.154 27831-27865/? D/ThreadTest: Counter : 42 , inside post Thread[MyTestThread,5,main]
2019-01-30 21:32:57.155 27831-27866/? D/ThreadTest: Counter : 43 , Thread[Timer-0,5,main]
2019-01-30 21:32:57.155 27831-27865/? D/ThreadTest: Counter : 43 , inside post Thread[MyTestThread,5,main]
2019-01-30 21:32:57.156 27831-27866/? D/ThreadTest: Counter : 44 , Thread[Timer-0,5,main]
2019-01-30 21:32:57.156 27831-27865/? D/ThreadTest: Counter : 44 , inside post Thread[MyTestThread,5,main]
2019-01-30 21:32:57.157 27831-27866/? D/ThreadTest: Counter : 45 , Thread[Timer-0,5,main]
2019-01-30 21:32:57.158 27831-27865/? D/ThreadTest: Counter : 45 , inside post Thread[MyTestThread,5,main]
2019-01-30 21:32:57.159 27831-27866/? D/ThreadTest: Counter : 46 , Thread[Timer-0,5,main]
2019-01-30 21:32:57.159 27831-27865/? D/ThreadTest: Counter : 46 , inside post Thread[MyTestThread,5,main]
2019-01-30 21:32:57.160 27831-27866/? D/ThreadTest: Counter : 47 , Thread[Timer-0,5,main]
2019-01-30 21:32:57.160 27831-27865/? D/ThreadTest: Counter : 47 , inside post Thread[MyTestThread,5,main]
2019-01-30 21:32:57.161 27831-27866/? D/ThreadTest: Counter : 48 , Thread[Timer-0,5,main]
2019-01-30 21:32:57.161 27831-27865/? D/ThreadTest: Counter : 48 , inside post Thread[MyTestThread,5,main]
2019-01-30 21:32:57.163 27831-27866/? D/ThreadTest: Counter : 49 , Thread[Timer-0,5,main]
2019-01-30 21:32:57.163 27831-27866/? D/ThreadTest: Counter : 50 , Thread[Timer-0,5,main]
2019-01-30 21:32:57.163 27831-27865/? D/ThreadTest: Counter : 50 , inside post Thread[MyTestThread,5,main]
2019-01-30 21:32:57.163 27831-27865/? D/ThreadTest: Counter : 50 , inside post Thread[MyTestThread,5,main]

测试代码:

private fun handlerThreadTest() {
    val handlerThread = HandlerThread("MyTestThread")
    handlerThread.start()

    val handler = Handler(handlerThread.looper)

    Log.d("ThreadTest", "Thread before ${Thread.currentThread()}")
    var i = 0
    val timerObj = Timer()
    val timerTaskObj = object : TimerTask() {
      override fun run() {
        i++
        //perform your action here
        Log.d("ThreadTest", "Counter : $i , ${Thread.currentThread()}")
        handler.post {
          Log.d("ThreadTest", "Counter : $i , inside post ${Thread.currentThread()}")
          if (i == 50)
            timerObj.cancel()
        }
      }
    }

    timerObj.schedule(timerTaskObj, 0, 5)

  }

解决方案

您的代码中有错误.在发布Runnable之前,需要从特性中提取值.否则,当Runnable稍后运行并提取值时,它将是最新的.

在Chromium中实施Web蓝牙时也犯了同样的错误.参见 https://bugs.chromium.org/p/chromium/issues/detail?id = 647673& desc = 2 .

还要注意,在较新版本的Android中,您可以直接在connectGatt中设置处理程序.

i'm working on android application which have communication with Bluetooth BLE device (with custom protocol which was developed specific for our product).

after i connect to the device i have callback public void onCharacteristicChanged(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic) which get triggered each time the device want to send me data. In app architecture we have actions (for example getDeviceStatus()), the protocol working in following way: phone connect to device -> make handshake -> send command (as byte) -> device respond with command (ok/not ok) -> and now the device start to send X byte[] chunks. So to make sure we handle the data in correct order and not get mess because of different threads i added HandlerThread:

HandlerThread handlerThread = new HandlerThread("ActionHandlerThread");
      handlerThread.start();
      Looper looper = handlerThread.getLooper();
      mHandler = new Handler(looper);

and each time the device send data i call

@Override
 public void onCharacteristicChanged(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic) {
    mHandler.post(() -> {
        mListener.onCharacteristicChanged(gatt, characteristic);
        }
    );  
 }

and the mListener send data to other class who check what kind of data arrived and what data is expected . If i understand correct each time i call post() new task is added to handler's looper and should process the task in the same order as i added them, but when i run the app in logs i see that the callback triggered correctly and post() called in correct order but the processing later happens in wrong order. For example the app expect to receive acknowledgement command but instead data came already, but this is impossible because the data can't came before the acknowledgement . the main reason i create HandlerThread is to make sure the whole operation with BLE will run on single thread and to not worry about synchronization problems, but now it looks like i do have sync problems . Do i miss some logic or understanding of the HandlerThread working.

Some tests i made with just timer and counter, we can see that when intervals are as small as 1 ms not all tasks is printed inside the post:

Interval of 5 ms:

2019-01-30 21:33:31.531 27991-27991/? D/ThreadTest: Thread before Thread[main,5,main]
2019-01-30 21:33:31.532 27991-28036/? D/ThreadTest: Counter : 1 , Thread[Timer-0,5,main]
2019-01-30 21:33:31.532 27991-28035/? D/ThreadTest: Counter : 1 , inside post Thread[MyTestThread,5,main]
2019-01-30 21:33:31.537 27991-28036/? D/ThreadTest: Counter : 2 , Thread[Timer-0,5,main]
2019-01-30 21:33:31.538 27991-28035/? D/ThreadTest: Counter : 2 , inside post Thread[MyTestThread,5,main]
2019-01-30 21:33:31.543 27991-28036/? D/ThreadTest: Counter : 3 , Thread[Timer-0,5,main]
2019-01-30 21:33:31.543 27991-28035/? D/ThreadTest: Counter : 3 , inside post Thread[MyTestThread,5,main]
2019-01-30 21:33:31.548 27991-28036/? D/ThreadTest: Counter : 4 , Thread[Timer-0,5,main]
2019-01-30 21:33:31.548 27991-28035/? D/ThreadTest: Counter : 4 , inside post Thread[MyTestThread,5,main]
2019-01-30 21:33:31.553 27991-28036/? D/ThreadTest: Counter : 5 , Thread[Timer-0,5,main]
2019-01-30 21:33:31.553 27991-28035/? D/ThreadTest: Counter : 5 , inside post Thread[MyTestThread,5,main]
2019-01-30 21:33:31.559 27991-28036/? D/ThreadTest: Counter : 6 , Thread[Timer-0,5,main]
2019-01-30 21:33:31.559 27991-28035/? D/ThreadTest: Counter : 6 , inside post Thread[MyTestThread,5,main]
2019-01-30 21:33:31.563 27991-28036/? D/ThreadTest: Counter : 7 , Thread[Timer-0,5,main]
2019-01-30 21:33:31.563 27991-28035/? D/ThreadTest: Counter : 7 , inside post Thread[MyTestThread,5,main]
2019-01-30 21:33:31.568 27991-28036/? D/ThreadTest: Counter : 8 , Thread[Timer-0,5,main]
2019-01-30 21:33:31.569 27991-28035/? D/ThreadTest: Counter : 8 , inside post Thread[MyTestThread,5,main]
2019-01-30 21:33:31.574 27991-28036/? D/ThreadTest: Counter : 9 , Thread[Timer-0,5,main]
2019-01-30 21:33:31.574 27991-28035/? D/ThreadTest: Counter : 9 , inside post Thread[MyTestThread,5,main]
2019-01-30 21:33:31.580 27991-28036/? D/ThreadTest: Counter : 10 , Thread[Timer-0,5,main]
2019-01-30 21:33:31.580 27991-28035/? D/ThreadTest: Counter : 10 , inside post Thread[MyTestThread,5,main]
2019-01-30 21:33:31.585 27991-28036/? D/ThreadTest: Counter : 11 , Thread[Timer-0,5,main]
2019-01-30 21:33:31.586 27991-28035/? D/ThreadTest: Counter : 11 , inside post Thread[MyTestThread,5,main]
2019-01-30 21:33:31.591 27991-28036/? D/ThreadTest: Counter : 12 , Thread[Timer-0,5,main]
2019-01-30 21:33:31.591 27991-28035/? D/ThreadTest: Counter : 12 , inside post Thread[MyTestThread,5,main]
2019-01-30 21:33:31.596 27991-28036/? D/ThreadTest: Counter : 13 , Thread[Timer-0,5,main]
2019-01-30 21:33:31.596 27991-28035/? D/ThreadTest: Counter : 13 , inside post Thread[MyTestThread,5,main]
2019-01-30 21:33:31.602 27991-28036/? D/ThreadTest: Counter : 14 , Thread[Timer-0,5,main]
2019-01-30 21:33:31.604 27991-28035/? D/ThreadTest: Counter : 14 , inside post Thread[MyTestThread,5,main]
2019-01-30 21:33:31.607 27991-28036/? D/ThreadTest: Counter : 15 , Thread[Timer-0,5,main]
2019-01-30 21:33:31.607 27991-28035/? D/ThreadTest: Counter : 15 , inside post Thread[MyTestThread,5,main]
2019-01-30 21:33:31.612 27991-28036/? D/ThreadTest: Counter : 16 , Thread[Timer-0,5,main]
2019-01-30 21:33:31.613 27991-28035/? D/ThreadTest: Counter : 16 , inside post Thread[MyTestThread,5,main]
2019-01-30 21:33:31.618 27991-28036/? D/ThreadTest: Counter : 17 , Thread[Timer-0,5,main]
2019-01-30 21:33:31.618 27991-28035/? D/ThreadTest: Counter : 17 , inside post Thread[MyTestThread,5,main]
2019-01-30 21:33:31.623 27991-28036/? D/ThreadTest: Counter : 18 , Thread[Timer-0,5,main]
2019-01-30 21:33:31.623 27991-28035/? D/ThreadTest: Counter : 18 , inside post Thread[MyTestThread,5,main]
2019-01-30 21:33:31.628 27991-28036/? D/ThreadTest: Counter : 19 , Thread[Timer-0,5,main]
2019-01-30 21:33:31.629 27991-28035/? D/ThreadTest: Counter : 19 , inside post Thread[MyTestThread,5,main]
2019-01-30 21:33:31.633 27991-28036/? D/ThreadTest: Counter : 20 , Thread[Timer-0,5,main]
2019-01-30 21:33:31.633 27991-28035/? D/ThreadTest: Counter : 20 , inside post Thread[MyTestThread,5,main]
2019-01-30 21:33:31.638 27991-28036/? D/ThreadTest: Counter : 21 , Thread[Timer-0,5,main]
2019-01-30 21:33:31.639 27991-28035/? D/ThreadTest: Counter : 21 , inside post Thread[MyTestThread,5,main]
2019-01-30 21:33:31.643 27991-28036/? D/ThreadTest: Counter : 22 , Thread[Timer-0,5,main]
2019-01-30 21:33:31.643 27991-28035/? D/ThreadTest: Counter : 22 , inside post Thread[MyTestThread,5,main]
2019-01-30 21:33:31.648 27991-28036/? D/ThreadTest: Counter : 23 , Thread[Timer-0,5,main]
2019-01-30 21:33:31.648 27991-28035/? D/ThreadTest: Counter : 23 , inside post Thread[MyTestThread,5,main]
2019-01-30 21:33:31.654 27991-28036/? D/ThreadTest: Counter : 24 , Thread[Timer-0,5,main]
2019-01-30 21:33:31.654 27991-28035/? D/ThreadTest: Counter : 24 , inside post Thread[MyTestThread,5,main]
2019-01-30 21:33:31.659 27991-28036/? D/ThreadTest: Counter : 25 , Thread[Timer-0,5,main]
2019-01-30 21:33:31.659 27991-28035/? D/ThreadTest: Counter : 25 , inside post Thread[MyTestThread,5,main]
2019-01-30 21:33:31.665 27991-28036/? D/ThreadTest: Counter : 26 , Thread[Timer-0,5,main]
2019-01-30 21:33:31.665 27991-28035/? D/ThreadTest: Counter : 26 , inside post Thread[MyTestThread,5,main]
2019-01-30 21:33:31.669 27991-28036/? D/ThreadTest: Counter : 27 , Thread[Timer-0,5,main]
2019-01-30 21:33:31.669 27991-28035/? D/ThreadTest: Counter : 27 , inside post Thread[MyTestThread,5,main]
2019-01-30 21:33:31.674 27991-28036/? D/ThreadTest: Counter : 28 , Thread[Timer-0,5,main]
2019-01-30 21:33:31.675 27991-28035/? D/ThreadTest: Counter : 28 , inside post Thread[MyTestThread,5,main]
2019-01-30 21:33:31.679 27991-28036/? D/ThreadTest: Counter : 29 , Thread[Timer-0,5,main]
2019-01-30 21:33:31.679 27991-28035/? D/ThreadTest: Counter : 29 , inside post Thread[MyTestThread,5,main]
2019-01-30 21:33:31.684 27991-28036/? D/ThreadTest: Counter : 30 , Thread[Timer-0,5,main]
2019-01-30 21:33:31.684 27991-28035/? D/ThreadTest: Counter : 30 , inside post Thread[MyTestThread,5,main]
2019-01-30 21:33:31.690 27991-28036/? D/ThreadTest: Counter : 31 , Thread[Timer-0,5,main]
2019-01-30 21:33:31.690 27991-28035/? D/ThreadTest: Counter : 31 , inside post Thread[MyTestThread,5,main]
2019-01-30 21:33:31.694 27991-28036/? D/ThreadTest: Counter : 32 , Thread[Timer-0,5,main]
2019-01-30 21:33:31.694 27991-28035/? D/ThreadTest: Counter : 32 , inside post Thread[MyTestThread,5,main]
2019-01-30 21:33:31.700 27991-28036/? D/ThreadTest: Counter : 33 , Thread[Timer-0,5,main]
2019-01-30 21:33:31.700 27991-28035/? D/ThreadTest: Counter : 33 , inside post Thread[MyTestThread,5,main]
2019-01-30 21:33:31.704 27991-28036/? D/ThreadTest: Counter : 34 , Thread[Timer-0,5,main]
2019-01-30 21:33:31.704 27991-28035/? D/ThreadTest: Counter : 34 , inside post Thread[MyTestThread,5,main]
2019-01-30 21:33:31.709 27991-28036/? D/ThreadTest: Counter : 35 , Thread[Timer-0,5,main]
2019-01-30 21:33:31.709 27991-28035/? D/ThreadTest: Counter : 35 , inside post Thread[MyTestThread,5,main]
2019-01-30 21:33:31.715 27991-28036/? D/ThreadTest: Counter : 36 , Thread[Timer-0,5,main]
2019-01-30 21:33:31.715 27991-28035/? D/ThreadTest: Counter : 36 , inside post Thread[MyTestThread,5,main]
2019-01-30 21:33:31.719 27991-28036/? D/ThreadTest: Counter : 37 , Thread[Timer-0,5,main]
2019-01-30 21:33:31.719 27991-28035/? D/ThreadTest: Counter : 37 , inside post Thread[MyTestThread,5,main]
2019-01-30 21:33:31.724 27991-28036/? D/ThreadTest: Counter : 38 , Thread[Timer-0,5,main]
2019-01-30 21:33:31.724 27991-28035/? D/ThreadTest: Counter : 38 , inside post Thread[MyTestThread,5,main]
2019-01-30 21:33:31.730 27991-28036/? D/ThreadTest: Counter : 39 , Thread[Timer-0,5,main]
2019-01-30 21:33:31.730 27991-28035/? D/ThreadTest: Counter : 39 , inside post Thread[MyTestThread,5,main]
2019-01-30 21:33:31.735 27991-28036/? D/ThreadTest: Counter : 40 , Thread[Timer-0,5,main]
2019-01-30 21:33:31.735 27991-28035/? D/ThreadTest: Counter : 40 , inside post Thread[MyTestThread,5,main]
2019-01-30 21:33:31.740 27991-28036/? D/ThreadTest: Counter : 41 , Thread[Timer-0,5,main]
2019-01-30 21:33:31.741 27991-28035/? D/ThreadTest: Counter : 41 , inside post Thread[MyTestThread,5,main]
2019-01-30 21:33:31.745 27991-28036/? D/ThreadTest: Counter : 42 , Thread[Timer-0,5,main]
2019-01-30 21:33:31.746 27991-28035/? D/ThreadTest: Counter : 42 , inside post Thread[MyTestThread,5,main]
2019-01-30 21:33:31.750 27991-28036/? D/ThreadTest: Counter : 43 , Thread[Timer-0,5,main]
2019-01-30 21:33:31.750 27991-28035/? D/ThreadTest: Counter : 43 , inside post Thread[MyTestThread,5,main]
2019-01-30 21:33:31.756 27991-28036/? D/ThreadTest: Counter : 44 , Thread[Timer-0,5,main]
2019-01-30 21:33:31.756 27991-28035/? D/ThreadTest: Counter : 44 , inside post Thread[MyTestThread,5,main]
2019-01-30 21:33:31.760 27991-28036/? D/ThreadTest: Counter : 45 , Thread[Timer-0,5,main]
2019-01-30 21:33:31.760 27991-28035/? D/ThreadTest: Counter : 45 , inside post Thread[MyTestThread,5,main]
2019-01-30 21:33:31.765 27991-28036/? D/ThreadTest: Counter : 46 , Thread[Timer-0,5,main]
2019-01-30 21:33:31.765 27991-28035/? D/ThreadTest: Counter : 46 , inside post Thread[MyTestThread,5,main]
2019-01-30 21:33:31.771 27991-28036/? D/ThreadTest: Counter : 47 , Thread[Timer-0,5,main]
2019-01-30 21:33:31.771 27991-28035/? D/ThreadTest: Counter : 47 , inside post Thread[MyTestThread,5,main]
2019-01-30 21:33:31.775 27991-28036/? D/ThreadTest: Counter : 48 , Thread[Timer-0,5,main]
2019-01-30 21:33:31.775 27991-28035/? D/ThreadTest: Counter : 48 , inside post Thread[MyTestThread,5,main]
2019-01-30 21:33:31.780 27991-28036/? D/ThreadTest: Counter : 49 , Thread[Timer-0,5,main]
2019-01-30 21:33:31.780 27991-28035/? D/ThreadTest: Counter : 49 , inside post Thread[MyTestThread,5,main]
2019-01-30 21:33:31.785 27991-28036/? D/ThreadTest: Counter : 50 , Thread[Timer-0,5,main]
2019-01-30 21:33:31.786 27991-28035/? D/ThreadTest: Counter : 50 , inside post Thread[MyTestThread,5,main]

Interval of 1 ms:

2019-01-30 21:32:57.104 27831-27831/? D/ThreadTest: Thread before Thread[main,5,main]
2019-01-30 21:32:57.105 27831-27866/? D/ThreadTest: Counter : 1 , Thread[Timer-0,5,main]
2019-01-30 21:32:57.106 27831-27865/? D/ThreadTest: Counter : 1 , inside post Thread[MyTestThread,5,main]
2019-01-30 21:32:57.107 27831-27866/? D/ThreadTest: Counter : 2 , Thread[Timer-0,5,main]
2019-01-30 21:32:57.107 27831-27865/? D/ThreadTest: Counter : 2 , inside post Thread[MyTestThread,5,main]
2019-01-30 21:32:57.109 27831-27866/? D/ThreadTest: Counter : 3 , Thread[Timer-0,5,main]
2019-01-30 21:32:57.110 27831-27865/? D/ThreadTest: Counter : 3 , inside post Thread[MyTestThread,5,main]
2019-01-30 21:32:57.111 27831-27866/? D/ThreadTest: Counter : 4 , Thread[Timer-0,5,main]
2019-01-30 21:32:57.111 27831-27865/? D/ThreadTest: Counter : 4 , inside post Thread[MyTestThread,5,main]
2019-01-30 21:32:57.112 27831-27866/? D/ThreadTest: Counter : 5 , Thread[Timer-0,5,main]
2019-01-30 21:32:57.112 27831-27865/? D/ThreadTest: Counter : 5 , inside post Thread[MyTestThread,5,main]
2019-01-30 21:32:57.114 27831-27866/? D/ThreadTest: Counter : 6 , Thread[Timer-0,5,main]
2019-01-30 21:32:57.114 27831-27866/? D/ThreadTest: Counter : 7 , Thread[Timer-0,5,main]
2019-01-30 21:32:57.114 27831-27865/? D/ThreadTest: Counter : 7 , inside post Thread[MyTestThread,5,main]
2019-01-30 21:32:57.115 27831-27865/? D/ThreadTest: Counter : 7 , inside post Thread[MyTestThread,5,main]
2019-01-30 21:32:57.115 27831-27866/? D/ThreadTest: Counter : 8 , Thread[Timer-0,5,main]
2019-01-30 21:32:57.116 27831-27865/? D/ThreadTest: Counter : 8 , inside post Thread[MyTestThread,5,main]
2019-01-30 21:32:57.117 27831-27866/? D/ThreadTest: Counter : 9 , Thread[Timer-0,5,main]
2019-01-30 21:32:57.117 27831-27866/? D/ThreadTest: Counter : 10 , Thread[Timer-0,5,main]
2019-01-30 21:32:57.118 27831-27865/? D/ThreadTest: Counter : 10 , inside post Thread[MyTestThread,5,main]
2019-01-30 21:32:57.118 27831-27865/? D/ThreadTest: Counter : 11 , inside post Thread[MyTestThread,5,main]
2019-01-30 21:32:57.118 27831-27866/? D/ThreadTest: Counter : 11 , Thread[Timer-0,5,main]
2019-01-30 21:32:57.118 27831-27865/? D/ThreadTest: Counter : 11 , inside post Thread[MyTestThread,5,main]
2019-01-30 21:32:57.120 27831-27866/? D/ThreadTest: Counter : 12 , Thread[Timer-0,5,main]
2019-01-30 21:32:57.120 27831-27865/? D/ThreadTest: Counter : 12 , inside post Thread[MyTestThread,5,main]
2019-01-30 21:32:57.121 27831-27866/? D/ThreadTest: Counter : 13 , Thread[Timer-0,5,main]
2019-01-30 21:32:57.122 27831-27865/? D/ThreadTest: Counter : 13 , inside post Thread[MyTestThread,5,main]
2019-01-30 21:32:57.122 27831-27866/? D/ThreadTest: Counter : 14 , Thread[Timer-0,5,main]
2019-01-30 21:32:57.123 27831-27865/? D/ThreadTest: Counter : 14 , inside post Thread[MyTestThread,5,main]
2019-01-30 21:32:57.124 27831-27866/? D/ThreadTest: Counter : 15 , Thread[Timer-0,5,main]
2019-01-30 21:32:57.125 27831-27865/? D/ThreadTest: Counter : 15 , inside post Thread[MyTestThread,5,main]
2019-01-30 21:32:57.125 27831-27866/? D/ThreadTest: Counter : 16 , Thread[Timer-0,5,main]
2019-01-30 21:32:57.126 27831-27865/? D/ThreadTest: Counter : 16 , inside post Thread[MyTestThread,5,main]
2019-01-30 21:32:57.127 27831-27866/? D/ThreadTest: Counter : 17 , Thread[Timer-0,5,main]
2019-01-30 21:32:57.127 27831-27866/? D/ThreadTest: Counter : 18 , Thread[Timer-0,5,main]
2019-01-30 21:32:57.127 27831-27865/? D/ThreadTest: Counter : 18 , inside post Thread[MyTestThread,5,main]
2019-01-30 21:32:57.128 27831-27865/? D/ThreadTest: Counter : 18 , inside post Thread[MyTestThread,5,main]
2019-01-30 21:32:57.129 27831-27866/? D/ThreadTest: Counter : 19 , Thread[Timer-0,5,main]
2019-01-30 21:32:57.129 27831-27866/? D/ThreadTest: Counter : 20 , Thread[Timer-0,5,main]
2019-01-30 21:32:57.129 27831-27865/? D/ThreadTest: Counter : 20 , inside post Thread[MyTestThread,5,main]
2019-01-30 21:32:57.129 27831-27865/? D/ThreadTest: Counter : 20 , inside post Thread[MyTestThread,5,main]
2019-01-30 21:32:57.130 27831-27866/? D/ThreadTest: Counter : 21 , Thread[Timer-0,5,main]
2019-01-30 21:32:57.130 27831-27865/? D/ThreadTest: Counter : 21 , inside post Thread[MyTestThread,5,main]
2019-01-30 21:32:57.131 27831-27866/? D/ThreadTest: Counter : 22 , Thread[Timer-0,5,main]
2019-01-30 21:32:57.131 27831-27865/? D/ThreadTest: Counter : 22 , inside post Thread[MyTestThread,5,main]
2019-01-30 21:32:57.132 27831-27866/? D/ThreadTest: Counter : 23 , Thread[Timer-0,5,main]
2019-01-30 21:32:57.133 27831-27866/? D/ThreadTest: Counter : 24 , Thread[Timer-0,5,main]
2019-01-30 21:32:57.133 27831-27865/? D/ThreadTest: Counter : 24 , inside post Thread[MyTestThread,5,main]
2019-01-30 21:32:57.133 27831-27865/? D/ThreadTest: Counter : 24 , inside post Thread[MyTestThread,5,main]
2019-01-30 21:32:57.134 27831-27866/? D/ThreadTest: Counter : 25 , Thread[Timer-0,5,main]
2019-01-30 21:32:57.134 27831-27865/? D/ThreadTest: Counter : 25 , inside post Thread[MyTestThread,5,main]
2019-01-30 21:32:57.135 27831-27866/? D/ThreadTest: Counter : 26 , Thread[Timer-0,5,main]
2019-01-30 21:32:57.135 27831-27865/? D/ThreadTest: Counter : 26 , inside post Thread[MyTestThread,5,main]
2019-01-30 21:32:57.136 27831-27866/? D/ThreadTest: Counter : 27 , Thread[Timer-0,5,main]
2019-01-30 21:32:57.136 27831-27865/? D/ThreadTest: Counter : 27 , inside post Thread[MyTestThread,5,main]
2019-01-30 21:32:57.138 27831-27866/? D/ThreadTest: Counter : 28 , Thread[Timer-0,5,main]
2019-01-30 21:32:57.138 27831-27865/? D/ThreadTest: Counter : 28 , inside post Thread[MyTestThread,5,main]
2019-01-30 21:32:57.139 27831-27866/? D/ThreadTest: Counter : 29 , Thread[Timer-0,5,main]
2019-01-30 21:32:57.139 27831-27865/? D/ThreadTest: Counter : 29 , inside post Thread[MyTestThread,5,main]
2019-01-30 21:32:57.140 27831-27866/? D/ThreadTest: Counter : 30 , Thread[Timer-0,5,main]
2019-01-30 21:32:57.140 27831-27865/? D/ThreadTest: Counter : 30 , inside post Thread[MyTestThread,5,main]
2019-01-30 21:32:57.142 27831-27866/? D/ThreadTest: Counter : 31 , Thread[Timer-0,5,main]
2019-01-30 21:32:57.142 27831-27865/? D/ThreadTest: Counter : 31 , inside post Thread[MyTestThread,5,main]
2019-01-30 21:32:57.143 27831-27866/? D/ThreadTest: Counter : 32 , Thread[Timer-0,5,main]
2019-01-30 21:32:57.143 27831-27865/? D/ThreadTest: Counter : 32 , inside post Thread[MyTestThread,5,main]
2019-01-30 21:32:57.144 27831-27866/? D/ThreadTest: Counter : 33 , Thread[Timer-0,5,main]
2019-01-30 21:32:57.145 27831-27865/? D/ThreadTest: Counter : 33 , inside post Thread[MyTestThread,5,main]
2019-01-30 21:32:57.146 27831-27866/? D/ThreadTest: Counter : 34 , Thread[Timer-0,5,main]
2019-01-30 21:32:57.146 27831-27865/? D/ThreadTest: Counter : 34 , inside post Thread[MyTestThread,5,main]
2019-01-30 21:32:57.147 27831-27866/? D/ThreadTest: Counter : 35 , Thread[Timer-0,5,main]
2019-01-30 21:32:57.147 27831-27865/? D/ThreadTest: Counter : 35 , inside post Thread[MyTestThread,5,main]
2019-01-30 21:32:57.148 27831-27866/? D/ThreadTest: Counter : 36 , Thread[Timer-0,5,main]
2019-01-30 21:32:57.148 27831-27865/? D/ThreadTest: Counter : 36 , inside post Thread[MyTestThread,5,main]
2019-01-30 21:32:57.150 27831-27866/? D/ThreadTest: Counter : 37 , Thread[Timer-0,5,main]
2019-01-30 21:32:57.150 27831-27866/? D/ThreadTest: Counter : 38 , Thread[Timer-0,5,main]
2019-01-30 21:32:57.150 27831-27865/? D/ThreadTest: Counter : 38 , inside post Thread[MyTestThread,5,main]
2019-01-30 21:32:57.150 27831-27865/? D/ThreadTest: Counter : 38 , inside post Thread[MyTestThread,5,main]
2019-01-30 21:32:57.151 27831-27866/? D/ThreadTest: Counter : 39 , Thread[Timer-0,5,main]
2019-01-30 21:32:57.151 27831-27865/? D/ThreadTest: Counter : 39 , inside post Thread[MyTestThread,5,main]
2019-01-30 21:32:57.152 27831-27866/? D/ThreadTest: Counter : 40 , Thread[Timer-0,5,main]
2019-01-30 21:32:57.152 27831-27865/? D/ThreadTest: Counter : 40 , inside post Thread[MyTestThread,5,main]
2019-01-30 21:32:57.153 27831-27866/? D/ThreadTest: Counter : 41 , Thread[Timer-0,5,main]
2019-01-30 21:32:57.154 27831-27866/? D/ThreadTest: Counter : 42 , Thread[Timer-0,5,main]
2019-01-30 21:32:57.154 27831-27865/? D/ThreadTest: Counter : 42 , inside post Thread[MyTestThread,5,main]
2019-01-30 21:32:57.154 27831-27865/? D/ThreadTest: Counter : 42 , inside post Thread[MyTestThread,5,main]
2019-01-30 21:32:57.155 27831-27866/? D/ThreadTest: Counter : 43 , Thread[Timer-0,5,main]
2019-01-30 21:32:57.155 27831-27865/? D/ThreadTest: Counter : 43 , inside post Thread[MyTestThread,5,main]
2019-01-30 21:32:57.156 27831-27866/? D/ThreadTest: Counter : 44 , Thread[Timer-0,5,main]
2019-01-30 21:32:57.156 27831-27865/? D/ThreadTest: Counter : 44 , inside post Thread[MyTestThread,5,main]
2019-01-30 21:32:57.157 27831-27866/? D/ThreadTest: Counter : 45 , Thread[Timer-0,5,main]
2019-01-30 21:32:57.158 27831-27865/? D/ThreadTest: Counter : 45 , inside post Thread[MyTestThread,5,main]
2019-01-30 21:32:57.159 27831-27866/? D/ThreadTest: Counter : 46 , Thread[Timer-0,5,main]
2019-01-30 21:32:57.159 27831-27865/? D/ThreadTest: Counter : 46 , inside post Thread[MyTestThread,5,main]
2019-01-30 21:32:57.160 27831-27866/? D/ThreadTest: Counter : 47 , Thread[Timer-0,5,main]
2019-01-30 21:32:57.160 27831-27865/? D/ThreadTest: Counter : 47 , inside post Thread[MyTestThread,5,main]
2019-01-30 21:32:57.161 27831-27866/? D/ThreadTest: Counter : 48 , Thread[Timer-0,5,main]
2019-01-30 21:32:57.161 27831-27865/? D/ThreadTest: Counter : 48 , inside post Thread[MyTestThread,5,main]
2019-01-30 21:32:57.163 27831-27866/? D/ThreadTest: Counter : 49 , Thread[Timer-0,5,main]
2019-01-30 21:32:57.163 27831-27866/? D/ThreadTest: Counter : 50 , Thread[Timer-0,5,main]
2019-01-30 21:32:57.163 27831-27865/? D/ThreadTest: Counter : 50 , inside post Thread[MyTestThread,5,main]
2019-01-30 21:32:57.163 27831-27865/? D/ThreadTest: Counter : 50 , inside post Thread[MyTestThread,5,main]

The code for the test:

private fun handlerThreadTest() {
    val handlerThread = HandlerThread("MyTestThread")
    handlerThread.start()

    val handler = Handler(handlerThread.looper)

    Log.d("ThreadTest", "Thread before ${Thread.currentThread()}")
    var i = 0
    val timerObj = Timer()
    val timerTaskObj = object : TimerTask() {
      override fun run() {
        i++
        //perform your action here
        Log.d("ThreadTest", "Counter : $i , ${Thread.currentThread()}")
        handler.post {
          Log.d("ThreadTest", "Counter : $i , inside post ${Thread.currentThread()}")
          if (i == 50)
            timerObj.cancel()
        }
      }
    }

    timerObj.schedule(timerTaskObj, 0, 5)

  }

解决方案

You have a bug in your code. You need to extract the value from the characteristic before you post your Runnable. Otherwise when the Runnable later runs and extracts the value, it will be the newest one.

Web Bluetooth implementation in Chromium made the same mistake. See https://bugs.chromium.org/p/chromium/issues/detail?id=647673&desc=2.

But also note that in newer versions of Android you can set a handler in connectGatt directly.

这篇关于处理程序后执行队列顺序不正确的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆