Android:有效循环吗?

时间:2011-04-14 12:19:45

标签: android performance drawing

目前我正在使用以下结构:

while(continue)
{
    if(somethingChanged)
    {
        draw();
    }
}

这种等待方式是否有效,或者有更好的方法吗?

-

根据要求,更多信息:

我在SurfaceView上绘图,使用Thread锁定Canvas并调用onDraw(Canvas)方法。当我绘制的东西没有改变时,我不需要调用onDraw(Canvas)方法,所以我保留了一个布尔值somethingChanged。

另外,当我触摸屏幕时,我会在触摸点画一个圆圈,所以当我触摸屏幕时,有些事情发生了变化。

5 个答案:

答案 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 );
}