Intereting Posts
Com.android.support:design:23.3.0 сломан, когда пользовательский вид, используемый в Tablayout Какая анимация / просмотр используется для последних приложений / истории в Android 5.0 (Lollipop)? Не можете нажать git через студию Android? Мгновенный запуск не будет работать в Android Studio, говорит Gradle Version 2.10. Я использую 2.10 Как создать андроид linearlayout с RTL горизонтальной ориентацией Как указать массив класса в параметре подписи метода GetMethodID? Неисправность воспроизведения песни в проигрывателе Google Music Родной андроид-шрифтFamily не вступает в силу Использование разделов APK для выпуска, но не тип отладки Debug Ptrace возвращает -1 на Android Android SDK версия в Eclipse? Не удалось разрешить целевой Android-x Как переопределить стили библиотеки, которая имеет свою собственную активность Как обновления приложений для Android работают технически? Условное включение / исключение ресурсов для сборки Android apk Методы загрузки данных в Async для Android

Как остановить обработчик Runnable?

Я использую обработчик в следующей программе, и я хочу остановить его, когда i = 5, но обработчик не останавливается и не запускается непрерывно.

b1.setOnClickListener(new OnClickListener() { public void onClick(View v) { handler = new Handler(); runnable = new Runnable() { public void run() { try { Toast.makeText(getApplicationContext(), "Handler is working", Toast.LENGTH_LONG).show(); System.out.print("Handler is working"); if(i==5){ //Thread.currentThread().interrupt(); handler.removeCallbacks(runnable); System.out.print("ok"); Toast.makeText(getApplicationContext(), "ok", Toast.LENGTH_LONG).show(); } i++; } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } handler.postDelayed(this, 5000); } }; handler.postDelayed(runnable, 5000); //return; } }); 

Solutions Collecting From Web of "Как остановить обработчик Runnable?"

Потому что вы снова вызываете postDelayed() после удаления обратных вызовов. Используйте этот код:

 final Handler handler = new Handler(); final Runnable runnable = new Runnable() { public void run() { Log.d("Runnable","Handler is working"); if(i == 5){ // just remove call backs handler.removeCallbacks(this); Log.d("Runnable","ok"); } else { // post again i++; handler.postDelayed(this, 5000); } } }; //now somewhere in a method b1.setOnClickListener(new OnClickListener() { public void onClick(View v) { handler.removeCallbacks(runnable); handler.postDelayed(runnable, 5000); } }); 
 protected void onStop() { super.onStop(); handler.removeCallbacks(runnable); } 

Вы можете остановить это так

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

 boolean bFlagForceExit = false; Handler timerHandler = new Handler(); private Runnable timerRunnable = new Runnable() { @Override public void run() { if (bFlagForceExit ) MyProcessForExit(); if (bSomeflagForRunAction) RunProcess(); timerHandler.postDelayed(this, MILISEGUNDOS_ESPERA); } }; private void MyProcessForExit() { timerHandler.removeCallbacks(timerRunnable); // close activity or whatever finish(); } private void RunProcess() { // action that i do when tick // time to leave or stop bFlagForceExit = true; } 

Затем я обнаружил, что это работает, если removeCallbacks(timerRunnable) был вызван для других потоков, поэтому я решил проблему вроде этого.

 boolean bFlagForceExit = false; Handler timerHandler = new Handler(); private Runnable timerRunnable = new Runnable() { @Override public void run() { if (bFlagForceExit ) { // add a thred for run your stop handler new Thread(new Runnable() { public void run() { SalirDeProceso(); } }).start(); } if (bSomeflagForRunAction) RUnProcess(); timerHandler.postDelayed(this, MILISEGUNDOS_ESPERA); } }; 

Вы не показываете, где инициализируется «i». Может быть, никогда не бывает <5.