长按一下即可执行操作

时间:2014-01-10 11:57:08

标签: java android

您好我正在尝试在用户按住按钮时执行某些操作。

我的问题是我的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;
    }

它直到不工作。

3 个答案:

答案 0 :(得分:1)

你没有r.run()来启动一个只运行一次的线程。

您要么new Thread(r).start();,要么使用ScheduledExecutorService

答案 1 :(得分:1)

您可以尝试使用Thread而不是Runnable,如下所示:

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

thread.start();

OR

你可以尝试将Runnable放在一个这样的线程中:

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

答案 2 :(得分:0)

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

此外,您可以使用mousePressed的{​​{1}}和mouseReleased个事件。

您应该在MouseListener中开始新的Thread,将实例存储在某处并在mousePressed上停止。

有关详细信息,请参阅文档。