我想在绘制两个平局之间暂停一下。我已经尝试了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);
}
}
答案 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
}
}