2014-01-10 64 views
0

您好,我正在尝试在用户按住按钮时执行一些操作。长时间执行操作

我的问题是,我的Runnable不会“运行”。

这是我的代码:

@Override 
    public boolean onLongClick(View v) { 
     final Runnable r = new Runnable() 
     { 
      public void run() 
      {//do the forwarding logic here 

       int test = 0; 

       if(holdingDown) 
        test++; 
       else 
        return; 

       Log.i("test", test+""); 
      } 
     }; 

     r.run(); 

     } 

     return false; 
    } 

    @Override 
    public boolean onTouch(View v, MotionEvent event) { 
     switch (event.getAction() & MotionEvent.ACTION_MASK) { 

      case MotionEvent.ACTION_UP: 
      { 
       holdingDown= false; 
       Log.i("holdingDown", "false"); 
       break; 
      } 
     } 
     return false; 
    } 

onTouch是用于检测当用户停止按压按钮。当我看到我的日志时,我看到Runnable只运行一次。

我的测试日志只得到值1

日志呼吁Log.i("holdingDown", "false")是越来越在正确的时间触发,只有当我停止触摸按钮。

为什么我的Runnable不能运行?谢谢。

编辑:

我试过这段代码:

@Override 
    public boolean onLongClick(View v) { 
     // TODO Auto-generated method stub 

     holdingDown = true; 

     new Thread(new Runnable() { 
      @Override 
      public void run() { 

         if(holdingDown) 
{ 
      int test = 0; 
      test++; 
      Log.i("test", test+""); 
} 
else 
return; 


      } 
     }).start(); 

     return false; 
    } 

它,直到不能正常工作。

+0

你在哪里更改为'holdDown'的值?此外,这不是开始和运行线程的方式 – gunar

回答

1

你可以尝试使用一个线程,而不是一个Runnable的是这样的:

Thread thread = new Thread() { 
    @Override 
    public void run() { 
     //code you want to run on long press 
    } }; 

thread.start(); 

OR

你可以尝试把可运行一个线程里面是这样的:

Thread thread = new Thread(new Runnable() { 
     public void run() { 
      // code you want to run on long press 
     } 
    }); 

thread.start(); 

更新: - 尝试这个?

@Override 
public boolean onLongClick(View v) { 
    // TODO Auto-generated method stub 

    holdingDown = true; 

    new Thread(new Runnable() { 
     @Override 
     public void run() { 

      if (holdingDown) { 
       int test = 0; 
       test++; 
       Log.i("test", test + ""); 
      } else { 
       Log.i("test", "else"); 
      } 
       return; 

     } 
    }).start(); 

    return false; 
} 
+0

它不工作看到我的编辑请 – dasdasd

1

您不需要做r.run()来启动一个只运行一次的线程。您可以使用new Thread(r).start();或使用ScheduledExecutorService

+0

它不起作用 – dasdasd

0

您可以创建一个名为HoldingDown类中重写Runnable和实例化一个对象Thread通过你HoldingDown的一个新的实例,并调用start方法。

另外,您还可以使用MouseListenermousePressedmouseReleased事件。

您应该在mousePressed中启动一个新的Thread,将该实例存储在某个地方,并将其停止在mouseReleased上。

请参阅文档以了解更多详细信息。