0

如果视图的可见性已消失,是否会在后台线程中更改文本、背景资源并在其中膨胀某些视图的应用程序崩溃?我已经用两个按钮进行了一些测试,一个可见,一个消失,如果我在后台线程中更改可见的文本,它会崩溃,当我用 GONE 可见性更改按钮的文本时,它没有崩溃. 有人可以解释一下吗?

4

2 回答 2

2

好的,我有东西给你。

事件处理和线程

一个视图的基本循环如下:

  1. 一个事件进来并被分派到适当的视图。视图处理事件并通知任何侦听器。

  2. 如果在处理事件的过程中,视图的边界可能需要改变,视图会调用requestLayout().

  3. 同样,如果在处理事件的过程中可能需要更改视图的外观,视图将调用invalidate().

  4. 如果调用了其中一个requestLayout()invalidate()框架将负责测量、布局和绘制适当的树。

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

你可以在这里找到更多http://developer.android.com/reference/android/view/View.html

在您的情况下,您的视图已经消失,所以我认为它没有附加到视图树。

于 2012-11-27T08:52:35.183 回答
1

你必须创建一个处理程序!
在该处理程序中放置您的代码以更新您的 UI,并在线程中调用处理程序!
你永远不应该直接用任何语言从线程更新 UI!这是编程中的一个大错误!

创建处理程序的示例:

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

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

updater1.sendEmptyMessage(0);

从线程中更改文本的行为在所有语言中都可能不同!但你永远不应该这样做,这是一个很大的错误!
也许当您尝试更新可见性为“GONE”的按钮上的文本时,它只是不起作用!但你看不到!

于 2012-11-27T08:44:41.117 回答