如何停止 Handler Runnable?

Posted

技术标签:

【中文标题】如何停止 Handler Runnable?【英文标题】:How to stop Handler Runnable? 【发布时间】:2013-09-11 08:07:30 【问题描述】:

我在以下程序中使用了一个处理程序,我想在 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;
        
    );

【问题讨论】:

你已经有了这个handler.removeCallbacks(runnable);developer.android.com/reference/android/os/Handler.html 你也可以使用倒数计时器、处理程序或计时器任务 cancelling a handler.postdelayed process的可能重复 停止可运行线程***.com/a/58038337/5788247 【参考方案1】:

因为您在删除回叫后再次调用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); 
    
);

【讨论】:

你能解释一下你为什么写 handler.postDelayed(runnable, 5000);两次 @AjitDubey 可能是最新的编辑将帮助您更好地理解。 @M-WaJeEh- 据我了解,第一个 postDelayed(runnable, 5000) 将在 5 秒后开始,另一个(在运行方法内部)开始计算 5 秒的间隔。我说的对吗? 是的,首先postDelayed 是启动runnable,它会继续运行直到 ``i==5` 为真。 请提供一些帮助:***.com/questions/40954945/…【参考方案2】:
protected void onStop() 
    super.onStop();
    handler.removeCallbacks(runnable);

你可以这样阻止它

【讨论】:

停止可运行线程***.com/a/58038337/5788247【参考方案3】:

我找到了适合我的解决方案。这是一个代码示例,我希望计时器停止,但我看到它还活着,即使我没有活动:

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

【讨论】:

【参考方案4】:

刚看到这个问题。 我会改用 CountDownTimer() 。 每秒运行 5 秒:

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();

【讨论】:

以上是关于如何停止 Handler Runnable?的主要内容,如果未能解决你的问题,请参考以下文章

Handler、Runnable 和 Threads 之间有啥区别?

Handler的postDelayed(Runnable, long)

如何在Android中停止可运行线程?

android中如何实现UI的实时更新

Android编程:如何在子线程中更新TextView控件

如何使用Handler