我正在尝试创建一个简单的游戏循环(它还不是真正的游戏),它显示一个圆圈,然后在它勾选100次后绘制另一个圆圈。我还有一个文本字段,可以显示循环运行的次数。相关代码如下:
MainActivity
public class MainActivity extends Activity
{
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
DrawView v = new DrawView(this);
v.setBackgroundColor(Color.WHITE);
setContentView(v);
}
}
drawView函数
public class DrawView extends SurfaceView implements SurfaceHolder.Callback
{
Paint p = new Paint();
MainThread thread;
private int y=0;
public DrawView(Context c)
{
super(c);
thread = new MainThread(this, getHolder());
thread.running = true;
getHolder().addCallback(this);
setFocusable(true);
}
public void draw(Canvas c)
{
if(c==null)
return;
super.onDraw(c);
p.setColor(Color.RED);
p.setTextSize(32);
p.setTypeface(Typeface.SANS_SERIF);
c.drawCircle(getWidth()/2-100,getHeight()/2, 50, p);
c.drawText("y = " + y, 50, 50, p);
if(y==100)
c.drawCircle(getWidth()/2+100,getHeight()/2, 50, p);
else
y++;
}
public void surfaceCreated(SurfaceHolder p1)
{
thread.start();
}
MainThread
public class MainThread extends Thread
{
private DrawView page;
private SurfaceHolder holder;
public boolean running;
public MainThread(DrawView p, SurfaceHolder h)
{
super();
page = p;
holder = h;
}
@Override
public void run()
{
while(running)
{
Canvas c = holder.lockCanvas();
page.draw(c);
holder.unlockCanvasAndPost(c);
}
}
}
它只显示第一个圆圈和“y = 2”的文字。似乎没有更新,或者它做了两次然后停止。我是Android编程新手,但不是Java。我确定我只是遗漏了一些简单的东西。谢谢你的帮助。
编辑:进一步观察,似乎线程随机崩溃。每次我运行应用程序时,它都会显示“y =”,然后每次都会显示不同的数字。我认为它会在崩溃前让它变得很多。关闭应用程序后,我收到一条消息“不幸的是,MyApp已经停止了”。我不太清楚Android如何工作以了解它崩溃的原因。编辑2:我发现它在行holder.unlockCanvasAndPost(c)上抛出了IllegalArgumentException。再说一遍,我不知道为什么。任何人都可以解释发生了什么以及如何解决它?
编辑3:记录每个刻度的y值表明它正确地进行了训练,并在达到100时按预期停止。屏幕上发生的事情并不能反映出某种原因。
答案 0 :(得分:0)
处理程序调用runnable,运行一次,然后决定是否应该再次调用。
类似的东西:
private Handler renderHandler = new Handler();
private Runnable renderRunnable = new Runnable() {
@Override
public void run() {
//... do stuff here;
if(shouldRunAgain){
renderHandler.postDelayed(renderRunnable, 1000); // for 1 second
}
}
};
renderHandler.post(renderRunnable);
编辑: 在没有看到日志猫的情况下,我将假设UI更新是从主UI线程以外的线程发生的,从而导致崩溃。