1

我很新到Android编程所以请原谅我的无知,来自handler的状态信号postDelayed?

我试图做简单的Android应用:

  • 用户按下一个按钮,启动postDelayed工作,然后等待上有条件的VAR
  • 超时后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()卡住等待,我甚至没有看到超时后“--->超时通知”消息...

我做错了什么?

编辑:试图安排搞砸例如...

回答

1

你不能做你想要做的事。处理程序在Looper线程上运行。使用默认构造函数创建的处理程序将使用当前正在运行的Looper线程。在这种情况下,它是主Looper线程(或UI线程)。所以,你在UI线程上锁定UI线程和处理程序,但是它永远不会达到那个点,因为你阻塞了UI线程。

此外,我从来没有看到你实际上调用了发布给Handler的方法。

+0

是的..我坏 - 我错过了它在按钮点击。 我实际上在做的是试图扫描BluetoothLowEnergy设备...所以在timeOutSignal()(坏名字,但我真的希望使片段简单...)我打电话BluetoothAdapter startScan()和调度(与postDelayed)stopScan()10秒超时。 – V0idd