сделать паузу между рисованием двух розыгрышей - PullRequest
1 голос
/ 27 сентября 2011

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

Ответы [ 3 ]

1 голос
/ 27 сентября 2011

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

см. this :

0 голосов
/ 27 сентября 2011

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

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
    }
}
0 голосов
/ 27 сентября 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);
...