我需要帮助在另一个方法完成之后立即启动一个方法,而不是在它期间

时间:2013-07-23 22:24:09

标签: java android android-asynctask game-engine

我正在制作游戏,在有人点击之后,一个球在屏幕上移动需要一些时间。我试图在球停止移动后做一个方法。我试过睡觉但它没有用。我也看了asynctask,并没有完全理解它。有人可以指出我正确的方向或告诉我如何使用我的代码asynctask,谢谢。我对此非常陌生,所以任何事情都会有所帮助。

第一部分是Main类,它包含游戏中动作的代码。 afterKick()方法是我想在kick()方法完成后发生的动作。

    final FrameLayout main = (FrameLayout) findViewById(R.id.main_view);
    main.setBackground(this.getResources().getDrawable(R.drawable.field));
    newBall = new Ball(this);
    main.addView(newBall);
        main.setOnTouchListener(new View.OnTouchListener() {
            public boolean onTouch(View v, MotionEvent event) {

                float x = event.getX();
                float y = event.getY();
                System.out.println("x:" + x + " y" + y);

                if(kick == false && attempt<10)
                {
                    setHeight(y, newBall);
                    kick(x,y,newBall,main);
                }
                afterKick();
                // TODO Auto-generated method stub
                return false;
            }
        });

一旦调用了kick()方法,它就会进入创建球的类。 onDraw方法不断重复,直到由于无效而不再重新绘制球。

@Override
protected void onDraw(Canvas canvas){
    super.onDraw(canvas);
    canvas.drawBitmap(scaled, left, top, null);
    if(topMax>=top)
    {
        setDone(true);
    }
    else if(straight == true && top> topMax)
    {
        kickStraight();
    }
    else if(righty == true && top>topMax)
    {
        kickRight();
    }
    else if(midRight == true && top>topMax)
    {
        kickMidRight();
    }
    else if(midLeft == true && top>topMax)
    {
        kickMidLeft();
    }
    else if(lefty == true && top>topMax)
    {
        kickLeft();
    }
    invalidate();
}

我无法弄清楚如何在invalidate不再重新启动onDraw方法后执行某些操作。任何帮助都会有用,谢谢!

1 个答案:

答案 0 :(得分:3)

AsyncTasks有一个get方法,它会强制程序在继续之前等待AsyncTask的输出。你可以做的是让AsyncTask在完成后返回一个值,在你的调用线程中你可以将这个值赋给变量。

 AsyncTask task = new AsyncTask().execute(params);
 Object output = task.get();

但是,使用get方法将阻止UI线程。更安全(和更好)的替代方法是使用AsyncTask的onPostExecute方法。这将在doInBackground方法完成后调用,并将在主UI线程上运行。