-1

所以我正在构建一个实验应用程序,其中背景会随机改变颜色。

我被困在背景变化上。

我有改变背景颜色的工作代码,但是当我把它放在一个线程/try and catch 括号中时,应用程序被强制关闭并且不会给我一个错误?

以下是在 oncreate 方法中使用时有效的代码:

View view = this.getWindow().getDecorView();
view.setBackgroundColor(Color.RED);

但是,当我想让它“休眠”1 秒钟然后将其更改为红色时,它就会爆炸。

请注意,此方法是与 oncreate 分开的方法,并且是从那里调用的,并且由于某种原因不起作用?

public void changeBackground(final View v){
Thread timer = new Thread(){
    public void run(){
        try{
            sleep(1000);
        }catch (InterruptedException e) {
            e.printStackTrace();
        }finally{
            v.setBackgroundColor(Color.RED);
        }
    }
};
timer.start();
}

我究竟做错了什么?我需要什么:当应用程序启动时,它必须等待 1 秒,然后更改背景颜色,而不会爆炸。

提前致谢!

4

4 回答 4

0

解决此问题的解决方案:-

  • 更新你的应用
  • 清除 Gmail 存储数据
  • 清除应用缓存和数据
  • 重置应用偏好
  • 重置智能手机出厂设置

我在 YouTube 的帮助下找到了这些步骤。

这是该链接:-

youtube.com/watch?v=fx8Fv8RXag8

于 2013-10-28T15:02:06.443 回答
0

您无法从自定义线程访问 UI 线程。您必须在 UI 线程中运行您的可运行文件。将您的changeBackground方法更改为以下内容,

    public void changeBackground(final View v) {
    Thread timer = new Thread() {
        public void run() {
            try {
                sleep(5000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            } finally {
                v.setBackgroundColor(Color.RED);
            }
        }
    };
    this.runOnUiThread(timer);
}

或者您可以使用Asynctask,这会为您解决这个问题。这里这里

于 2013-10-27T09:30:10.177 回答
0

UI 操作不能在线程中完成

 v.setBackgroundColor(Color.RED); 

从 finally 中删除上面的行并使用 arunOnUIthread()来更新 finally 中的 UI。

您的最终代码将如下所示

public void changeBackground(final View v){
        Thread timer = new Thread(){
            public void run(){
                try{
                    sleep(1000);
                }catch (InterruptedException e) {
                    e.printStackTrace();
                }finally{

                    runOnUiThread(new Runnable() {

                        @Override
                        public void run() {
                            // TODO Auto-generated method stub
                              v.setBackgroundColor(Color.RED);
                        }
                    });

                }
            }
        };
        timer.start();
        }
于 2013-10-27T09:23:14.837 回答
0

在 UI 线程上操作视图状态:

v.post(new Runnable() {
    @Override
    public void run() {
        v.setBackgroundColor(Color.RED);
    }
});

有关它的更多信息:http: //developer.android.com/guide/components/processes-and-threads.html

于 2013-10-27T09:24:16.313 回答