2011-04-10 103 views
0

我想改变布局背景。动态更改布局背景

下面是从logcat的日志:

04-10 14:59:55.291: WARN/dalvikvm(263): threadid=15: thread exiting with uncaught exception (group=0x4001b188) 
04-10 14:59:55.309: ERROR/AndroidRuntime(263): Uncaught handler: thread Thread-8 exiting due to uncaught exception 
04-10 14:59:55.331: ERROR/AndroidRuntime(263): android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views. 
04-10 14:59:55.331: ERROR/AndroidRuntime(263):  at android.view.ViewRoot.checkThread(ViewRoot.java:2683) 
04-10 14:59:55.331: ERROR/AndroidRuntime(263):  at android.view.ViewRoot.requestLayout(ViewRoot.java:557) 
04-10 14:59:55.331: ERROR/AndroidRuntime(263):  at android.view.View.requestLayout(View.java:7918) 
04-10 14:59:55.331: ERROR/AndroidRuntime(263):  at android.view.View.requestLayout(View.java:7918) 
04-10 14:59:55.331: ERROR/AndroidRuntime(263):  at android.view.View.requestLayout(View.java:7918) 
04-10 14:59:55.331: ERROR/AndroidRuntime(263):  at android.view.View.requestLayout(View.java:7918) 
04-10 14:59:55.331: ERROR/AndroidRuntime(263):  at android.view.View.setBackgroundDrawable(View.java:7275) 
04-10 14:59:55.331: ERROR/AndroidRuntime(263):  at android.view.View.setBackgroundResource(View.java:7188) 
04-10 14:59:55.331: ERROR/AndroidRuntime(263):  at walk.me.Splasher$1.run(Splasher.java:35) 

walk.me.Splasher$1.run(Splasher.java:35) is this line: 

layout.setBackgroundResource(temp); What should I do? 

回答

3

使用处理器或在UI线程上运行它。 A Handler可以更好地完成这项任务。

runOnUiThread(new Runnable() { 
     @Override 
     public void run() { 
      // TODO Auto-generated method stub 

     } 
    }); 
+0

但我有一个图像在屏幕上停留了一段时间的同一线程,所以我现在想让几个图像在while循环中发生变化。是否因为我使用Thread Handler Handler? – 2011-04-10 15:36:33

+0

使用handler.postRunnable(wallPaperRunnable,延迟),你就完成了。阅读http://developer.android.com/resources/articles/painless-threading.html和http://developer.android.com/reference/android/os/Handler.html – 2011-04-10 15:40:09

2

您不能从后台线程修改用户界面。请参阅文章PainlessThreading。从您的代码结构中,我强烈建议您使用该文章中所述的AsyncTask。它允许你运行一个后台线程,在UI线程上反复触发动作。一旦学习了如何使用AsyncTask类,这种事情比将单个Runnable对象提供给Handler更容易。

+0

http:// pastebin中的Handler文档.com/desptV0g是这样的吗? – 2011-04-10 17:40:07

+0

在LinearLayout布局上给出错误=(LinearLayout)findViewById(R.id.splash); line – 2011-04-10 17:41:05

+0

@NikolaMKD - 'findViewById'是另一种只能在UI线程上使用的方法。根据你的代码,我建议你使用一个带有LinearLayout参数的构造函数子类AsyncTask(或Thread),并且在设置AsyncTask或Thread时在UI线程上调用findViewById。 – 2011-04-10 19:55:19