2017-08-06 100 views
0

我創建了一個處理程序來重複執行一個任務,並且我還希望在條件滿足後在該處理程序中銷燬它。處理程序不停止 - Android

pinHandler = new Handler();

現在,我創建了兩個函數分別啓動和停止任務。現在

void startRepeatingPins() { 
     mPinSetter.run(); 
    } 
    Runnable mPinSetter = new Runnable() { 
     @Override 
     public void run() { 
      try{ 
       System.out.println("PinIndwx count is :"+pinIndexCount); 
       if(pinIndexCount==(plist.size()-1)) 
       { 
        stopUpdatingPins(); 
        pinIndexCount=0; 
        //pinHandler.removeCallbacks(mPinSetter); 
        System.out.println("Handler stopped by itself."); 
       } 
       else 
       { 
        updatePoint(plist.get(pinIndexCount)); 
        pinIndexCount++; 
       } 

      } 
      finally { 
       pinHandler.postDelayed(mPinSetter, pinInterval); 
      } 
     } 
    }; 

    private void stopUpdatingPins() 
    { 
     pinIndexCount=0; 
     pinHandler.removeCallbacks(mPinSetter); 
     System.out.println("Called the stop function."); 
    } 

,問題是,如果我稱之爲stopUpdatingPins功能,處理程序停止,但是當我嘗試從處理程序中自動停止它,它只是不停止。雖然stopUpdatingPins函數確實被調用。

回答

1

更改你這樣的startRepeatingPins(),你不應該直接調用run。如果你這樣運行,那麼從處理程序中刪除它是沒有意義的。所以將Handnable與Handler連接起來。

void startRepeatingPins() { 
    pinHandler.post(mPinSetter); 
} 

您在finally後加入延遲,這意味着你在第一循環,如果在最後重新啓動被停止,所以它永遠不會停止。所以改變你的runnable像這樣,

Runnable mPinSetter = new Runnable() { 
     @Override 
     public void run() { 

       System.out.println("PinIndwx count is :"+pinIndexCount); 
       if(pinIndexCount==(plist.size()-1)) 
       { 
        stopUpdatingPins(); 
        pinIndexCount=0; 
        //pinHandler.removeCallbacks(mPinSetter); 
        System.out.println("Handler stopped by itself."); 
       } 
       else 
       { 
        updatePoint(plist.get(pinIndexCount)); 
        pinIndexCount++; 
        pinHandler.postDelayed(mPinSetter, pinInterval); 
       } 


     } 
    }; 
+0

爲什麼它會停止當我明確調用removecallbacks但不是當我在處理程序中調用它時? – driftking9987

+0

我在自己的回答中解釋過**你在最後添加了延遲,這意味着如果循環並在最後再次啓動,你首先停止**這意味着你正在停止,但是你又立即開始。 –