How to stop Handler Runnable?

前端 未结 4 2027
半阙折子戏
半阙折子戏 2020-12-24 07:13

I am using a handler in the following program and I want to stop it when i=5 but the handler doesn\'t stop and run continuously.

   b1.setOnClickListener(ne         


        
相关标签:
4条回答
  • 2020-12-24 07:34
    protected void onStop() {
        super.onStop();
        handler.removeCallbacks(runnable);
    }
    

    you can stop it like this

    0 讨论(0)
  • 2020-12-24 07:48

    I found a solution which works for me. This is an example of code, where I expect a timer stop, but I saw it was alive, even if I was out of activity:

    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;
    }
    

    Then I found that this works if removeCallbacks(timerRunnable) was called for other threads, so, I solved the problem like this.

    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);        }
    };
    
    0 讨论(0)
  • 2020-12-24 07:49

    Just saw this question. I would use CountDownTimer() instead. Run it for 5 seconds total and every second:

    new CountDownTimer(5000, 1000) {
        public void onTick(long milsecRemain) {
            // Code to run every second
            Log.i("Seconds left", String.valueOf(milsecRemain/1000));
    }
        public void onFinish() {
            // 10 seconds have passed
        }
    }.start();
    
    0 讨论(0)
  • 2020-12-24 07:51

    Because you call postDelayed() again after removing call backs. Please use this code:

    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); 
        }
    });
    
    0 讨论(0)
提交回复
热议问题