如何停止 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 之间有啥区别?