我有一个简单的类,里面有一个线程。每当用户单击按钮时,我都想运行线程。一切工作正常,除了只要我在线程已运行时单击按钮,我的onTouch仅在线程完成执行后执行。
..
MyTouchAnimatorClass touchAnimatorClass = new MyTouchAnimatorClass();
view.setOnClickListener( new View.OnClickListener()
{
@Override
public void onClick( View view )
{
touchAnimatorClass.onTouch();
}
});
..
我的课上有线程:
Class MyTouchAnimatorClass
{
private boolean threadRunning = false;
public void onTouch() // <-- only executes AFTER the thread is complete
{
if( !threadRunning )
animate();
}
private void animate()
{
threadRunning = true;
Runnable r = new Runnable()
{
@Override
public void run()
{
activity.runOnUiThread(new Runnable()
{
@Override
public void run()
{
int i=0;
boolean doBreak = false;
while( true )
{
i+=1;
if( i == 100 )
break;
}
}
}
}
}
new Thread( r ).start();
threadRunning = false;
}
}
我不明白为什么会这样, Runnable 不是在自己的线程中运行吗?有什么建议吗?谢谢!
编辑: 我尝试使用
new Thread( r ).start();
代替:
r.run();
但不幸的是,同样的问题仍然存在:
如果我第二次单击该按钮(线程仍从第一次单击开始运行),则它应执行onTouch,但不应执行animate(),因为它仍从上次单击开始运行。
实际发生的情况:直到第一次单击的线程完成执行后,触摸才响应。然后onTouch触发(即使我是在几秒钟前按下的),然后再次启动新线程。
如果我快速按该按钮10次,它将连续执行10个循环,而不是一个循环并阻塞另一个循环。
答案 0 :(得分:2)
activity.runOnUiThread
要求Android系统在UI线程上运行此Runnable
。
您宁愿做new Thread(r).start();
赞:
private void animate()
{
threadRunning = true;
//Define the work as a Runnable
Runnable r = new Runnable()
{
@Override
public void run()
{
int i=0;
//boolean doBreak = false; //Not used
while( true )
{
i+=1;
if( i == 100 )
break;
}
threadRunning = false; //Just before leaving
}
}
//Give that work to a new thread and start the thread
new Thread(r).run();
}
答案 1 :(得分:0)
Runnable
不是线程,只是要在线程中执行的一组指令
为了实现您想要的目标
new Thread(r).start();
在代码结尾