[英]How to stop Handler 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;
}
});
因為你在刪除postDelayed()
后再次調用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。
剛看到這個問題。 我會使用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();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.