【问题标题】:How to periodically display a rectangle in an android activity如何在android活动中定期显示一个矩形
【发布时间】:2014-01-06 12:38:45
【问题描述】:

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

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

解决方案:

在响应者的帮助下,我创建了两个计时器,一个用于黑色,一个用于白色,从而解决了我的问题。黑色的开始延迟了我想要显示白屏的持续时间。两者具有相同的执行率,因此显示白屏,duration 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));
}

【问题讨论】:

  • 后台可以访问ui属性,但是要先访问ui线程,调用getActivity().runOnUiThread();如果您想更改某些内容,并将等待逻辑放在该线程之外

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


【解决方案1】:

您可以为此使用计时器类以重复间隔执行某些任务:

//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);

【讨论】:

  • 我在 run 方法中使用 view.setBackgroundColor(Color.parseColor("#FFFFFF")) 尝试了您的建议,但得到了相同的错误,即只有原始线程可以触摸视图。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    创建一个 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);
    

    【讨论】:

    • 我已将此代码放入 onResume 但收到此错误“无法在未调用 Looper.prepare() 的线程内创建处理程序”。这是什么意思?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-30
    • 1970-01-01
    • 1970-01-01
    • 2011-01-15
    相关资源
    最近更新 更多