1

Я очень новой для Android программирования, так пожалуйста, простите мое невежество ...состояние сигнал от обработчика postDelayed?

Я пытаюсь сделать простой 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» после таймаута ...

Что я делаю неправильно?

EDIT: Пытался исправить перепутались пример ...

ответ

1

Вы не можете делать то, что вы пытаетесь сделать. Обработчики работают по Looper потокам. Обработчики, созданные с помощью конструктора по умолчанию, будут использовать поток Looper, который в настоящее время выполняется. В этом случае это основной поток Looper (или поток пользовательского интерфейса). Таким образом, вы блокируете поток пользовательского интерфейса, и обработчик разблокируется в потоке пользовательского интерфейса, но он никогда не достигнет этой точки, потому что вы блокируете поток пользовательского интерфейса.

Кроме того, ни в коем случае не вижу, что вы на самом деле называете метод, который отправляет обработчик.

+0

Да .. мне плохо - я пропустил это, нажав кнопку. То, что я на самом деле делаю, - это попытка сканирования устройств BluetoothLowEnergy ... Так что в timeOutSignal() (неправильное имя, но я действительно хотел сделать простой сниппет ...) Я вызываю BluetoothAdapter startScan() и планирую (с postDelayed) stopScan() с таймаутом 10 с. – V0idd

Смежные вопросы