0

我想在android屏幕上定期显示一个白色矩形;或更改背景颜色。例如,每 500 毫秒,我希望屏幕颜色从黑色变为白色,持续大约 200 毫秒,然后变回黑色。

做这个的最好方式是什么?我确实尝试了异步任务,但得到一个错误,只有原始线程可以触摸视图。我有一个类似的 asynctask,它听起来周期性的音调并且工作正常。

解决方案:

在响应者的帮助下,我通过创建两个计时器来解决我的问题,一个用于黑色,一个用于白色。黑色的开始延迟了我想要显示白屏的持续时间。两者具有相同的执行率,因此显示白屏,持续时间ms 后显示黑屏。例如,屏幕为黑色,但每秒闪烁白色,持续 200 毫秒。

    @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));
}
4

3 回答 3

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);
于 2014-01-06T12:54:28.573 回答
0

AsyncTask 主要用于执行后台线程活动,例如从远程服务器下载数据。它在自己的线程上运行,这就是为什么当您尝试从 AsyncTask 访问任何 View 的 Activity 时,它会给出 Error that only the original thread can touch the View

您可以将 Timer 类或 AlarmManager 类用于重复性任务。访问我以前的答案

于 2014-01-06T12:41:57.907 回答
0

创建一个 Timer 任务方法并在 timertask 内部给它一个 700 毫秒的周期性持续时间显示黑色背景,然后创建一个显示白色背景的处理程序并将其延迟 500 毫秒

仅在 uithread 中尝试所有这些

不要像这样使用新线程或异步任务:

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);
于 2014-01-06T13:02:31.343 回答