如果视图的可见性是 GONE,那么在后台线程中更改文本,后台资源并膨胀其中的一些视图时,应用程序是否会崩溃?我用两个按钮做了一些测试,一个 visible 和一个 gone,当我在后台线程中更改 visible 的文本时,它崩溃了,当我更改具有 GONE 可见性的按钮的文本时,它工作得很好,没有崩溃,有人能解释一下吗?
ie3xauqp1#
好吧,我有东西给你。
事件处理和线程化
视图的基本循环如下所示:1.一个事件进入并被分派到适当的视图。视图处理该事件并通知任何侦听器。1.如果在处理事件的过程中,视图的边界可能需要更改,则视图将调用requestLayout()。1.类似地,如果在处理事件的过程中视图的外观可能需要更改,则视图将调用invalidate()。1.如果调用了requestLayout()或invalidate(),框架将负责测量、布局和绘制树。
requestLayout()
invalidate()
**注意:**整个视图树都是单线程的,在调用任何视图的任何方法时,都必须始终在UI线程上。如果您在其他线程上工作,并且希望从该线程更新视图的状态,则应使用Handler。
你可以在这里找到更多http://developer.android.com/reference/android/view/View.html。在你的情况下,你的视图已经消失了,所以我认为它没有附加到视图树。
ergxz8rk2#
您必须创建一个处理程序!在该处理程序中放入更新UI的代码,并在线程中调用处理程序!你不应该直接从一个线程更新UI,这是编程中的一个大错误!创建处理程序的示例:
static Handler updater1 = new Handler() { @Override public void handleMessage(Message msg) { //your code to update the UI } };
从线程调用处理程序的示例:
updater1.sendEmptyMessage(0);
在所有的语言中,改变线程中的文本的行为可能是不同的!但是你不应该这样做,这是一个很大的错误!也许当你试图更新一个可见性按钮上的文本“消失”,它只是不工作!但你看不到它!
2条答案
按热度按时间ie3xauqp1#
好吧,我有东西给你。
事件处理和线程化
视图的基本循环如下所示:
1.一个事件进入并被分派到适当的视图。视图处理该事件并通知任何侦听器。
1.如果在处理事件的过程中,视图的边界可能需要更改,则视图将调用
requestLayout()
。1.类似地,如果在处理事件的过程中视图的外观可能需要更改,则视图将调用
invalidate()
。1.如果调用了
requestLayout()
或invalidate()
,框架将负责测量、布局和绘制树。**注意:**整个视图树都是单线程的,在调用任何视图的任何方法时,都必须始终在UI线程上。如果您在其他线程上工作,并且希望从该线程更新视图的状态,则应使用Handler。
你可以在这里找到更多http://developer.android.com/reference/android/view/View.html。
在你的情况下,你的视图已经消失了,所以我认为它没有附加到视图树。
ergxz8rk2#
您必须创建一个处理程序!
在该处理程序中放入更新UI的代码,并在线程中调用处理程序!
你不应该直接从一个线程更新UI,这是编程中的一个大错误!
创建处理程序的示例:
从线程调用处理程序的示例:
在所有的语言中,改变线程中的文本的行为可能是不同的!但是你不应该这样做,这是一个很大的错误!
也许当你试图更新一个可见性按钮上的文本“消失”,它只是不工作!但你看不到它!