所以我正在构建一个实验应用,其中背景会随机改变颜色。
我坚持改变背景。
我有改变背景颜色的工作代码,但当我把它放在一个线程/ try和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秒钟,然后更改背景颜色,而不会将其轰炸出来。
提前致谢!
答案 0 :(得分:0)
无法在线程
中完成UI操作 v.setBackgroundColor(Color.RED);
从最后删除上面的行并使用runOnUIthread()
更新最后的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();
}
答案 1 :(得分:0)
在UI线程上处理视图状态:
v.post(new Runnable() {
@Override
public void run() {
v.setBackgroundColor(Color.RED);
}
});
有关它的更多信息:http://developer.android.com/guide/components/processes-and-threads.html
答案 2 :(得分:0)
您无法从自定义线程访问UI线程。您必须在UI线程中运行runnable。将您的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);
}
答案 3 :(得分:0)
解决此问题的解决方案: -
我在YouTube的帮助下找到了这些步骤。
以下是该链接: -
youtube.com/watch?v=fx8Fv8RXag8