2017-08-06 51 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

我在自己的回答中解释过**你在最后添加了延迟,这意味着如果循环并在最后再次启动,你首先停止**这意味着你正在停止,但是你又立即开始。 –