在绘制两个平局之间暂停

时间:2011-09-27 11:35:49

标签: android multithreading drawing android-canvas draw

我想在绘制两个平局之间暂停一下。我已经尝试了Thread.sleep,处理程序,asyncTask并获得了相同的结果 - 当活动启动时我必须等待一段时间才能看到第一次绘制,只有当我调用相同的方法时(测试)再次,我看到第二次抽奖,而不是再次看到第一次抽奖。这是我的代码:

public void test(){
button.setClickable(false);
button.setBackgroundColor(Color.DKGRAY);
view.setFromAtoB(true);
view.invalidate();
AsyncTask<Void, Void, Void> task = new AsyncTask<Void, Void, Void>() {
    @Override
    protected Void doInBackground(Void... params) {
        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            }
        return null;
    }

    @Override
    protected void onPostExecute(Void result) {
        view.setMoveAB(true);
        view.postInvalidate();
        button.setBackgroundColor(Color.GRAY);
        button.setClickable(true);           
    }
};
task.execute((Void[])null);

问题出在哪里?为什么我看不到某种和谐,先画画,暂停,第二次画? :)也许我已经阻止了UI线程。对于绘图我使用画布。在onDraw方法中,我进行了一些计算并调用drawRodsAndDiscs方法:

private void drawRodsAndDiscs(Canvas canvas){
    Paint paint = new Paint();
    drawRods(canvas);
    paint.setColor(Color.GREEN);
    paint.setStyle(Paint.Style.STROKE);
    for (Rect disc : discs) {
        canvas.drawRect(disc, paint);
    } 
}

3 个答案:

答案 0 :(得分:1)

尝试使用简单的CountDownTimer代替Thread.sleep(以毫秒为单位);

参考this

答案 1 :(得分:0)

对于简单的一次性延迟,您可以改为使用Handler

        Handler handler = new Handler();
        handler.postDelayed(new Runnable() {                
            @Override
            public void run() {
                view.setMoveAB(true);
                view.invalidate();
                button.setBackgroundColor(Color.GRAY);
                button.setClickable(true); 
            }
        }, 2000);

答案 2 :(得分:0)

我会将此代码用于您的问题。 计时器完成后,它会自动重启。 试试这个:

private boolean running = false;
private Handler handler;

public void onCreate(Bundle savedInstanceState) {
    handler = new Handler(this.getMainLooper()); //Run it in MainLooper
    this.handler.postDelayed(this.counterThread, 200); //Start timer in 200ms
}

private Thread counterThread = new Thread() {
public void run() {
        if (isRunning()) {
            return;
        }
        setRunning(true);

// 10minute until finish, 200ms between ticks
        CountDownTimer ct = new CountDownTimer(10 * 60 * 1000, 200) {

            public void onFinish() {
                setRunning(false);
            }

            public void onTick(long time) {
                    //Do your shitznaz
            }
        };
        ct.start();
    }
};

protected boolean isRunning() {
    return this.running;
}
protected void setRunning(boolean b) {
    this.running = b;
    if (!b) {
        // Reset timer
        this.handler.postDelayed(this.counterThread, 200); //Restarts the timer in 200ms
    }
}