android从后台线程更改UI-为什么它工作?

wqsoz72f  于 2023-03-27  发布在  Android
关注(0)|答案(2)|浏览(108)

如果视图的可见性是 GONE,那么在后台线程中更改文本,后台资源并膨胀其中的一些视图时,应用程序是否会崩溃?我用两个按钮做了一些测试,一个 visible 和一个 gone,当我在后台线程中更改 visible 的文本时,它崩溃了,当我更改具有 GONE 可见性的按钮的文本时,它工作得很好,没有崩溃,有人能解释一下吗?

ie3xauqp

ie3xauqp1#

好吧,我有东西给你。

事件处理和线程化

视图的基本循环如下所示:
1.一个事件进入并被分派到适当的视图。视图处理该事件并通知任何侦听器。
1.如果在处理事件的过程中,视图的边界可能需要更改,则视图将调用requestLayout()
1.类似地,如果在处理事件的过程中视图的外观可能需要更改,则视图将调用invalidate()
1.如果调用了requestLayout()invalidate(),框架将负责测量、布局和绘制树。

**注意:**整个视图树都是单线程的,在调用任何视图的任何方法时,都必须始终在UI线程上。如果您在其他线程上工作,并且希望从该线程更新视图的状态,则应使用Handler。

你可以在这里找到更多http://developer.android.com/reference/android/view/View.html
在你的情况下,你的视图已经消失了,所以我认为它没有附加到视图树。

ergxz8rk

ergxz8rk2#

您必须创建一个处理程序!
在该处理程序中放入更新UI的代码,并在线程中调用处理程序!
你不应该直接从一个线程更新UI,这是编程中的一个大错误!
创建处理程序的示例:

static Handler updater1 = new Handler() {
@Override
public void handleMessage(Message msg) {
   //your code to update the UI
   }
};

从线程调用处理程序的示例:

updater1.sendEmptyMessage(0);

在所有的语言中,改变线程中的文本的行为可能是不同的!但是你不应该这样做,这是一个很大的错误!
也许当你试图更新一个可见性按钮上的文本“消失”,它只是不工作!但你看不到它!

相关问题