сделать паузу между розыгрышем двух розыгрышей

Я хочу сделать паузу между рисованием двух розыгрышей. Я пробовал 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);

В чем проблема? Почему я не вижу какой-то гармонии, первый розыгрыш, пауза, второй розыгрыш? :) Возможно, я заблокировал ветку пользовательского интерфейса. Для рисования я использую холст. В методе 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);
    } 
}

person Mario    schedule 27.09.2011    source источник


Ответы (3)


Я бы использовал этот код для вашей проблемы. Когда таймер заканчивается, он автоматически перезапускается. Попробуй это:

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
    }
}
person DagW    schedule 27.09.2011

Попробуйте использовать простой CountDownTimer вместо Thread.sleep(int miliseconds);

см. это:

person Houcine    schedule 27.09.2011

Для простой разовой задержки вы можете использовать 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);
person Che Jami    schedule 27.09.2011