在 Android 中通过线程更改 UI 元素

发布于 2024-12-08 12:27:11 字数 217 浏览 2 评论 0原文

如何通过另一个线程通过 setBackgroundColor() 更改 LinearLayout 的背景?

我了解到,Android UI 框架不是线程安全的,因此您无法通过 UI 线程以外的其他线程更改 UI 元素。

我的目标是通过调用 setBackgroundColor() 方法来创建频闪灯效果,并在填充整个屏幕的 LinearLayout 上更改颜色(在本例中为黑/白/黑等)。

How do i change the background of a LinearLayout via setBackgroundColor() by another thread?

I learned, that the Android UI Framework is not threadsafe, so you can't change UI elements by another Thread than the UI thread.

My goal is to create a strobe light effect by calling the setBackgroundColor() method with changing colors (in this case black/white/black/ect,) on a LinearLayout which fills the entire screen.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

初见 2024-12-15 12:27:11

一种方法是将 Handler 与消息队列一起使用。您在主 UI 线程中实例化 Handler,然后使用 obtainMessage() 将消息发送到 Handler。因此,一个示例如下

public final Handler updateTextView = new Handler(){
   @Override
   public void handleMessage(Message msg)
   {
      if(msg.what == UPDATE_TEXT){
          myTextView.setText("arg1 = " + msg.arg1 +
                             "; arg2 = " + msg.arg2 + "; " + (String)msg.obj);
      }
   }
}

: 然后在您的线程中您可以调用:

String myString = new String("test");
updateTextView.obtainMessage(UPDATE_TEXT, 10, 20, myString).sendToTarget();

如果调用一次,结果将是 myTextView 现在显示“arg1 = 10; arg2 = 20; test”。

One way is to use Handler with message queues. You instantiate the Handler in the main UI thread, then use obtainMessage() to send messages to the Handler. So an example would be like

public final Handler updateTextView = new Handler(){
   @Override
   public void handleMessage(Message msg)
   {
      if(msg.what == UPDATE_TEXT){
          myTextView.setText("arg1 = " + msg.arg1 +
                             "; arg2 = " + msg.arg2 + "; " + (String)msg.obj);
      }
   }
}

Then in your thread you can call:

String myString = new String("test");
updateTextView.obtainMessage(UPDATE_TEXT, 10, 20, myString).sendToTarget();

The result if called once will be myTextView now says "arg1 = 10; arg2 = 20; test".

楠木可依 2024-12-15 12:27:11

阅读有关无痛线程的博文。基本上 UI 的更改必须发生在 UI 线程上。文章描述了实现这一目标的几种方法。 IMO在你的情况下最好使用 AsyncTask< /a>.

Read blogpost about painless threading. Basically changes in UI must happen on UI thread. Article describes a few ways to achieve that. IMO in your case it would be best to use AsyncTask.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文