如何取消postDelayed()的执行

时间:2017-04-05 17:04:54

标签: java android android-studio

我正在创建一个应用程序,其中可以动态创建某种小部件,并可以通过拖放重新排列。我正在尝试实现两件事:

  1. 长按以开始拖放
  2. 短按(或点击)打开菜单以更改某些设置。
  3. 但是我遇到了一个问题,我无法取消处理程序的postdelayed()函数中的代码。我正在使用以下代码来实现它。

    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Test");
            Console.ReadLine();
        }
    }
    

    但问题是,当我长按对象时,它工作正常。我可以开始拖放。但是当我按下它时,ACTION_UP事件的代码会执行,但runnable中的代码仍会执行。当我短按对象时如何取消可运行代码?

4 个答案:

答案 0 :(得分:4)

您必须保留对RunnablesHandler的引用,并使用Handler#removeCallbacks()

基本上是这样的:

Handler h = new Handler();
Runnable r = new Runnable() { /* does something */
h.postDelayed(r, 1000);

// When you want to cancel.
h.removeCallbacks(r);

答案 1 :(得分:0)

Runnable事件之外声明您的onTouch,就像您的班级中的单独方法一样。然后,当您想要实际执行runnable时,请调用您的方法。

快速'肮脏的例子:

onTouch(..) {
  if (eventDown) {
     // start Runnable
  }

  if (eventUp) {
    // Do not call runnable
  }

}

private void executeMyRunnable( /* Any arguments you need in Runnable */) {
   // Your runnable code here
}

答案 2 :(得分:0)

您可以通过在action.down上的系统时间和action.up上的系统时间之间的时间差来检查长按。如果差异大于5000毫秒,则执行可运行代码,或者执行对话框代码。

答案 3 :(得分:0)

只需运行handler.removeCallbacksAndMessages(null);