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