我想在Android屏幕上定期显示一个白色矩形;或更改背景颜色。例如,每隔500毫秒,我希望屏幕颜色从黑色变为白色,大约200毫秒,然后再变回黑色。
最好的方法是什么?我确实尝试过asynctask,但得到的错误只有原始线程可以触及View。我有一个类似的asynctask,听起来是一个周期性的音调,并且工作正常。
SOLUTION:
在响应者的帮助下,我通过创建两个计时器来解决我的问题,一个用于黑色,一个用于白色。黑色的开始延迟了我想要显示白色屏幕的持续时间。两者都具有相同的执行率,因此显示白色屏幕,然后在持续时间 ms之后显示黑屏。例如,屏幕为黑色,但每秒闪烁白色200 ms。
@Override
protected void onResume() {
super.onResume();
mBlackTimer = new Timer();
mBlackTimer.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
runOnUiThread(new Runnable() {
@Override
public void run() {
view.setBackgroundColor(Color.parseColor("#000000"));
}
});
}
}, duration, (long) (1000 / visionPeriod));
mWhiteTimer = new Timer();
mWhiteTimer.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
runOnUiThread(new Runnable() {
@Override
public void run() {
view.setBackgroundColor(Color.parseColor("#ffffff"));
}
});
}
}, 0, (long) (1000 / visionPeriod));
}
答案 0 :(得分:3)
您可以使用计时器类来重复执行某些任务:
//Declare the timer
Timer t = new Timer();
//Set the schedule function and rate
t.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
//Called each time when 1000 milliseconds (1 second) (the period parameter)
}
},
//Set how long before to start calling the TimerTask (in milliseconds)
0,
//Set the amount of time between each execution (in milliseconds)
1000);
答案 1 :(得分:0)
AsyncTask主要用于执行后台线程活动,例如从远程服务器下载数据。它运行在它自己的线程上,这就是为什么当您从AsyncTask尝试访问任何活动视图时,它会给出错误that only the original thread can touch the View
。
您可以将Timer类或AlarmManager类用于重复性任务。访问我之前的answer。
答案 2 :(得分:0)
创建一个Timer任务方法并在timertask中给它一个700ms的周期持续时间显示黑色背景,然后创建一个处理程序,用于显示白色背景并将延迟时间延迟500ms
仅在uithread中尝试所有这些
不要使用新线程或asynctask 像这样:
mTimer = new Timer();
mTtask = new TimerTask() {
public void run() {
//set your black background here
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
// set your white background here
}
}, 500);
}
};
mTimer.schedule(mTtask, 1, 700);