如何在android活动中定期显示矩形

时间:2014-01-06 12:38:45

标签: android android-asynctask android-activity periodic-task

我想在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));
}

3 个答案:

答案 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);