2016-08-31 5 views
0

Я пытаюсь остановить Runnable с помощью removeCallbacks, но почему-то это не остановится. - вот мои переменныеAndroid Runnable не останавливается после removeCallbacks()

private int mInterval = 2000; // 2 seconds by default, can be changed later 
private Handler mHandler = new Handler(); 

и мой работоспособной

Runnable mStatusChecker = new Runnable() { 
    @Override 
    public void run() { 
     try { 

       checkPayNow(); 

     } finally { 
      // 100% guarantee that this always happens, even if 
      // your update method throws an exception 
      mHandler.postDelayed(mStatusChecker, mInterval); 
     } 
    } 
}; 

и метод, который я бегу пока она дает мне определенное значение, то я остановить

public void checkPayNow(){ 

    if (!url.isEmpty()){ 

     //url now has text 

     mHandler.removeCallbacks(mStatusChecker); 
    }else { 
     //no text yet 
    } 


} 
+0

, где вы сейчас вызываете checkPayNow? –

+0

Im, вызывающий Runnable On a Button Нажмите –

+1

Вы получаете ошибку, потому что независимо от того, отмените ли вы ее в 'checkPayNow()' или нет, вы все равно вызываете 'postDelayed()' на своем обработчике через ваш 'finally'-блок (которые вы также указываете в своем комментарии). – Shaishav

ответ

1
boolean stoped = false; 

Runnable mStatusChecker = new Runnable() { 
    @Override 
    public void run() { 
     try {  
      checkPayNow(); 
     } finally { 
      if(!stoped) 
      mHandler.postDelayed(mStatusChecker, mInterval); 
     } 
    } 
}; 

Сделайте stoped = true, если вы хотите остановиться.

и удалить обработчик от checkPayNow().

public void checkPayNow(){ 

    if (!url.isEmpty()){ 
     //url now has text 
     //mHandler.removeCallbacks(mStatusChecker); 
    }else { 
     //no text yet 
    } 
} 
0

Вы можете попробовать сделать без removeCallbacks примерно:

Runnable mStatusChecker = new Runnable() { 
    @Override 
    public void run() { 
     if(!checkPayNow()) { 
//if not ready so far, then check in some delay again 
      mHandler.postDelayed(mStatusChecker, mInterval); 
     } 
    } 
}; 

public boolean checkPayNow(){ 

    return !url.isEmpty(); 


}