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