Android 来自处理器的条件信号延迟?

Android 来自处理器的条件信号延迟?,android,android-handler,postdelayed,android-handlerthread,Android,Android Handler,Postdelayed,Android Handlerthread,我对Android编程非常陌生,所以请原谅我的无知 我正在尝试制作简单的Android应用程序: 用户按下按钮,启动postDelayed作业,然后等待条件变量 超时后,postDelayer作业应发出信号 private final static long TIMEOUT = 10000; private Handler mHandler; final Lock lock = new ReentrantLock(); final Condition condition = lock.new

我对Android编程非常陌生,所以请原谅我的无知

我正在尝试制作简单的Android应用程序:

  • 用户按下按钮,启动postDelayed作业,然后等待条件变量
  • 超时后,postDelayer作业应发出信号

    private final static long TIMEOUT = 10000;
    private Handler mHandler;
    final Lock lock = new ReentrantLock();
    final Condition condition  = lock.newCondition();
    
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        ...
        mHandler = new Handler();
        ...
    }
    
    private void timeOutSignal() {
        mHandler.postDelayed(new Runnable() {
            @Override
            public void run() {
    
                Log.d(">> ", "---> timeout notify");
                lock.lock();
                try {
                    condition.signal(); // releases lock and waits until doSomethingElse is called
                } finally {
                    lock.unlock();
                }
            }
        }, TIMEOUT);
    }
    public void buttonClick(View view) {
    
        timeOutSignal();
        Log.i("???", "... WAIT");
    
        lock.lock();
        try {
            condition.await();
        } catch (InterruptedException e) {
            // todo
        } finally {
            lock.unlock();
        }
    
        Log.i("???", "... WAIT DONE !");
    }
    
发生的情况是buttonClick()卡在等待中,我甚至看不到超时后的“-->timeout notify”消息

我做错了什么


编辑:试图修复混乱的示例…

您无法执行您试图执行的操作。处理程序在线程上运行。使用默认构造函数创建的处理程序将使用当前正在运行的循环器线程。在本例中,它是主循环器线程(或UI线程)。因此,您正在锁定UI线程,而处理程序将解锁UI线程,但它永远不会达到这一点,因为您正在阻止UI线程


而且,我从来没有看到您实际调用发布到处理程序的方法

是的。。我很糟糕-我错过了它在按钮点击。我实际上是在扫描蓝牙低能耗设备。。。因此,在timeOutSignal()中(名称不好,但我真的想让代码段简单一些…),我调用BluetoothAdapter startScan()并调度(使用postDelayed)stopScan(),超时时间为10秒。