android 从后台线程更改 UI - 为什么它有效?

问题描述 投票:0回答:2

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

android view background-process
2个回答
2
投票

好的,我有东西给你。

事件处理和线程

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

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

  2. 如果在处理事件的过程中,视图的边界可能需要 要更改,视图将调用

    requestLayout()
    .

  3. 类似地,如果在处理事件的过程中视图的 外观可能需要更改,视图会调用

    invalidate()
    .

  4. 如果

    requestLayout()
    invalidate()
    被调用,框架 将负责测量、布置和绘制树 合适的。

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

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

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


1
投票

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

创建处理程序的示例:

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

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

updater1.sendEmptyMessage(0);

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

© www.soinside.com 2019 - 2024. All rights reserved.