Intereting Posts
Как правильно фильтровать пакет, замененный трансляцией Android: Каково имя папки файлов jar (LIB или LIBS)? В какой очереди приложений для приоритетов Android (Asynk Task, Multithreading) вы бы порекомендовали Android? Как узнать, нажата ли кнопка «Готово» в ActionMode Android Vertical Seek Bar, например приложение Google Play Music Шрифт Awesome не работает в браузере Android. Диалоговое окно Android Image / Popup того же размера, что и изображение, и без рамки SSLHandshakeException на Android 4.4 и ниже Как правильно выравнивать виджет в горизонтальной линейной компоновке андроида? Разрешение предоставляется только системному приложению, в манифесте Изменение значка навигационного ящика на панели действий android «RequestLayout () неправильно вызван …» ошибка на Android 4.3 Android WebView Javascript из активов Firebase на Android: Как проверить Firebase auth неудачную причину? Ошибка регистрации зарегистрированного получателя?

Как отменить обработчик в коде?

Я создаю 1 минуту задержанного таймера для выключения службы, если он не завершен. Выглядит так:

private Handler timeoutHandler = new Handler(); 

Внутри onCreate ()

 timeoutHandler.postDelayed(new Runnable() { public void run() { Log.d(LOG_TAG, "timeoutHandler:run"); DBLog.InsertMessage(getApplicationContext(), "Unable to get fix in 1 minute"); finalizeService(); } }, 60 * 1000); 

Если я получу работу до этой минуты, я хотел бы вернуть эту задержанную вещь, но не знаю, как это сделать.

Solutions Collecting From Web of "Как отменить обработчик в коде?"

Вы не можете сделать это с анонимным Runnable. Как насчет сохранения Runnable для именованной переменной?

 Runnable finalizer = new Runnable() { public void run() { Log.d(LOG_TAG, "timeoutHandler:run"); DBLog.InsertMessage(getApplicationContext(), "Unable to get fix in 1 minute"); finalizeService(); } }; timeoutHandler.postDelayed(finalizer, 60 * 1000); ... // Cancel the runnable timeoutHandler.removeCallbacks(finalizer); 

Возможно, вы захотите заменить использование postDelayed с помощью sendMessageDelayed следующим образом:

 private Handler timeoutHandler = new Handler(){ @Override public void handleMessage(Message msg) { switch (msg.what){ case 1: ((Runnable)msg.obj).run(); break; } } }; 

Затем опубликуйте сообщение:

 Message m = Message.obtain(); m.what = 1; m.obj = new Runnable(){ public void run() { Log.d(LOG_TAG, "timeoutHandler:run"); DBLog.InsertMessage(getApplicationContext(), "Unable to get fix in 1 minute"); finalizeService(); } }; timeoutHandler.sendMessageDelayed(m, 60 * 1000); 

И затем отмените:

 timeoutHandler.removeMessages(1); 

Не требуется отслеживание требуемого расхода.

Если вы не хотите сохранять ссылку на runnable, вы можете просто вызвать:

 timeoutHandler.removeCallbacksAndMessages(null); 

В официальной документации говорится:

… Если токен равен нулю, все обратные вызовы и сообщения будут удалены.

Если я получу работу до этой минуты, я хотел бы вернуть эту задержанную вещь, но не знаю, как это сделать.

Используйте Handler.removeCallbacks(yourRunnable) .