目前我正在使用以下结构:
while(continue)
{
if(somethingChanged)
{
draw();
}
}
这种等待方式是否有效,或者有更好的方法吗?
-
根据要求,更多信息:
我在SurfaceView上绘图,使用Thread锁定Canvas并调用onDraw(Canvas)方法。当我绘制的东西没有改变时,我不需要调用onDraw(Canvas)方法,所以我保留了一个布尔值somethingChanged。
另外,当我触摸屏幕时,我会在触摸点画一个圆圈,所以当我触摸屏幕时,有些事情发生了变化。
答案 0 :(得分:3)
你还可以使用wait()
并在其他线程notify()
发生变化时(如果其他线程更改了somethingChanged)。
答案 1 :(得分:2)
你可能在玩游戏,我推荐那篇文章:http://dewitters.koonsolo.com/gameloop.html你的请求有很好的解决方案。
答案 2 :(得分:2)
Android有一个比std java方法更好的空闲循环机制。 它由一个Looper和一个Handler组成,为你工作:
Handler myHandler;
...
public void run() {
Looper.prepare(); //this tells Android that your thread will contain a loop
myHandler = new Handler() {
public void handleMessage(Message msg) {
draw();
}
};
Looper.loop; //starts the loop
}
调用draw方法所需要做的就是向该处理程序发送一条消息,而不是设置boolean var。
Message mess;
myHandler.sendMessage(mess)
这样你也可以将该消息中的任何对象发送到循环,并且android为你做了线程同步和消息队列的东西。而且 - 最重要的是 - 它也很有效率。
答案 3 :(得分:1)
如果没有改变,这是一个无限循环,很可能会使用100%的cpu,所以我要说你至少应该添加一些Thread.sleep()
调用,让其他线程有机会做某事(例如更改somethingChanged
)
答案 4 :(得分:1)
通常,在无限循环中,你应该有一些机制来避免它接管cpu的所有时间。例如,这是通过睡眠来完成的。即使是短暂的睡眠也会减轻处理器的使用。 假设此代码在一个线程中:
while(continue)
{
if(somethingChanged)
{
draw();
}
Thread.sleep( mySleepTime );
}