如何等待Runnable完成?

时间:2013-07-03 16:42:32

标签: android andengine runnable

我有一个名为loadBalls()的方法。在这个方法中,我调用了另一个名为removeOldBalls()的方法。 在removeOldBalls()中,我有一个runnable来分离场景中的孩子。 以下是两种方法:

public static void loadBalls() {
    removeOldBalls();

    for (int i = 0; i < MAX_BALL; i++) {
        int x = MathUtils.random(0, CAMERA_WIDTH - BALL_SIZE);
        int y = BALL_SIZE;
        final Ball ball = new Ball(x, y, BALL_SIZE, BALL_SIZE, GraphicsManager.trBalloons[i]);

        scene.registerTouchArea(ball);
        balls.add(ball);
        if (!balls.get(i).hasParent()) {
            scene.attachChild(balls.get(i));
        }
        Log.e("test", "load");
    }

}

public static void removeOldBalls() {
    ((BaseLiveWallpaperService) LWP.context).runOnUpdateThread(new Runnable() {

        public void run() {
            Log.e("test", "remove");
            scene.detachChildren();
        }
    });

    if (balls != null) {
        int length = balls.size();
        for (int i = 0; i < length; i++) {
            fsw.destroyBody(balls.get(i).body);
        }
        balls.clear();
        Log.e("test", "clear");
    }

}

我需要的是在添加新儿童之前删除所有儿童。但是当在源代码上面运行时,首先添加子项,然后删除子项。 请告诉我如何在添加之前等待删除完成。

2 个答案:

答案 0 :(得分:1)

我想找一堂课android.os.Handler。然后,您可以创建两个线程:一个用于删除所有子项,另一个用于添加子项。然后将这些线程添加到Handler中,如下所示:

handler.post(new Runnable(){

            @Override
            public void run() {
              // Thread to remove children                    
            }
        });

handler.post(new Runnable(){

            @Override
            public void run() {
              // Thread to add children                 
            }
        });

一旦您逐个添加它们,Android SDK将按照添加的顺序执行它们。因此,这将照顾您的订购问题。

答案 1 :(得分:0)

将添加子项的代码移动到另一个方法,例如addBalls

private void addBalls() {
    for (int i = 0; i < MAX_BALL; i++) {
        int x = MathUtils.random(0, CAMERA_WIDTH - BALL_SIZE);
        int y = BALL_SIZE;
        final Ball ball = new Ball(x, y, BALL_SIZE, BALL_SIZE, GraphicsManager.trBalloons[i]);

        scene.registerTouchArea(ball);
        balls.add(ball);
        if (!balls.get(i).hasParent()) {
            scene.attachChild(balls.get(i));
        }
        Log.e("test", "load");
    }
}

在调用run 之后,在Runnable scene.detachChildren方法之后调用此方法:

public void run() {
    Log.e("test", "remove");
    scene.detachChildren();
    addBalls();
}