处理程序不停止 - Android

Handler not stopping - 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 函数。

改变你startRepeatingPins()这样,你不应该直接调用运行。如果您的 运行 喜欢这样,那么就没有必要从处理程序中删除它。所以附加 Runnable 和 Handler。

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

您在 finally 中添加了 post 延迟,这意味着您首先停止 if 循环并在 finally 中重新开始,因此它永远不会停止。所以像这样改变你的运行nable,

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);
                }


        }
    };