您好我正在尝试在用户按住按钮时执行某些操作。
我的问题是我的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 :(得分: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
上停止。
有关详细信息,请参阅文档。