为什么我们不能在其他线程中更新视图,当我们这样做时,它报告异常,是什么原因

神户23

我是android新手,看了博客,很多人说不能在其他线程更新view,必须在ui线程更新,请问是什么原因,为什么我们做的时候会报异常?任何人都可以给出原因

雷诺阿罗德

在过去的几周里,我阅读了有关如何将视图添加到窗口的源代码。

当我们调用setContentViewset view 时,它实际上调用了window.setContentView并且最终ActivityThread.handleResumeActivity会调用 ActivityonResume方法,视图显示。我们看handleResumeActivity方法。它将调用活动makeVisible方法。

...
if (r.activity.mVisibleFromClient) {
                r.activity.makeVisible();
            }
...
// the makeVieible will call wm.addView method
void makeVisible() {
        if (!mWindowAdded) {
            ViewManager wm = getWindowManager();
            wm.addView(mDecor, getWindow().getAttributes());
            mWindowAdded = true;
        }
        mDecor.setVisibility(View.VISIBLE);
    }
// this metod in the last called WindowGolbal.addView;then in the inner method;
// it will call ViewRootImpl.setView, in this method, it calls requestLayout
public void setView(View view, WindowManager.LayoutParams attrs, View panelParentView) {
...
// Schedule the first layout -before- adding to the window
                // manager, to make sure we do the relayout before receiving
                // any other events from the system.
                requestLayout();
}

@Override
    public void requestLayout() {
        if (!mHandlingLayoutInLayoutRequest) {
            checkThread();
            mLayoutRequested = true;
            scheduleTraversals();
        }
    }
void checkThread() {
        if (mThread != Thread.currentThread()) {
            throw new CalledFromWrongThreadException(
                    "Only the original thread that created a view hierarchy can touch its views.");
        }
    }

所以我们在这里发现它提醒我们我们不能更新视图。系统这样做,使 UI 显示流畅,更新视图简单。如果许多线程可以更新它。这是一件坏事。因为它必须处理并发问题

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么我们不能在本地类中定义好友功能的原因是什么?

来自分类Dev

为什么我们不能在Elixir保护子句或宏中使用其他功能?

来自分类Dev

为什么我们不能在Java 8流中抛出异常?

来自分类Dev

为什么我们不能从工作线程更新UI?与其他变量/对象相同

来自分类Dev

当我们在 Linq 上使用 .Select(x=>new object) 时,为什么我们不能在多方面选择任何属性

来自分类Dev

为什么我们不能更新定义中包含DISTINCT子句的视图?

来自分类Dev

为什么当我们联系不存在的枚举时我们不会得到异常?

来自分类Dev

当PDO告诉我们不要这样做时,为什么会生成警告?

来自分类Dev

当我们从UDP服务器接收数据包时,为什么我们必须在单独的线程中接收它们?

来自分类Dev

当我们在视图中访问未定义的实例变量时,Rails为什么不引发异常?

来自分类Dev

我们为什么可以这样做:Base * base = new Derived; 虽然我们不能做衍生*衍生=新的基础?

来自分类Dev

当我们想要删除它时,为什么要在集合名称后添加“s”?

来自分类Dev

为什么我们不能在声明结构变量名称时使用连字符?

来自分类Dev

还有其他原因为什么我们使用填充使序列长度相同?

来自分类Dev

为什么我们不能在C#中的结构中定义数组

来自分类Dev

Rest API中的事件流是什么,为什么我们需要它?

来自分类Dev

为什么我们不能在聚合中具体实现基接口?

来自分类Java

为什么我们不能在类中为方法添加默认值

来自分类Dev

为什么我们不能在静态内部类中定义main函数?

来自分类Dev

为什么我们不能在构造函数中创建非静态自引用对象

来自分类Javascript

为什么我们不能在三元运算符中返回?

来自分类Java

为什么我们不能在Java 7+中打开类?

来自分类Dev

为什么我们不能在main函数中定义函数?

来自分类Dev

为什么我们不能在col标签中设置颜色?

来自分类Dev

为什么我们不能在Express.js中执行多个response.send?

来自分类Dev

为什么我们不能在决策树中随机启动根节点?

来自分类Dev

为什么我们不能在python中更改字符串的特定值

来自分类Dev

为什么我们不能在Java的普通方法中调用this()方法?

来自分类Dev

为什么我们不能在操作系统的内核中添加最大的功能?

Related 相关文章

  1. 1

    为什么我们不能在本地类中定义好友功能的原因是什么?

  2. 2

    为什么我们不能在Elixir保护子句或宏中使用其他功能?

  3. 3

    为什么我们不能在Java 8流中抛出异常?

  4. 4

    为什么我们不能从工作线程更新UI?与其他变量/对象相同

  5. 5

    当我们在 Linq 上使用 .Select(x=>new object) 时,为什么我们不能在多方面选择任何属性

  6. 6

    为什么我们不能更新定义中包含DISTINCT子句的视图?

  7. 7

    为什么当我们联系不存在的枚举时我们不会得到异常?

  8. 8

    当PDO告诉我们不要这样做时,为什么会生成警告?

  9. 9

    当我们从UDP服务器接收数据包时,为什么我们必须在单独的线程中接收它们?

  10. 10

    当我们在视图中访问未定义的实例变量时,Rails为什么不引发异常?

  11. 11

    我们为什么可以这样做:Base * base = new Derived; 虽然我们不能做衍生*衍生=新的基础?

  12. 12

    当我们想要删除它时,为什么要在集合名称后添加“s”?

  13. 13

    为什么我们不能在声明结构变量名称时使用连字符?

  14. 14

    还有其他原因为什么我们使用填充使序列长度相同?

  15. 15

    为什么我们不能在C#中的结构中定义数组

  16. 16

    Rest API中的事件流是什么,为什么我们需要它?

  17. 17

    为什么我们不能在聚合中具体实现基接口?

  18. 18

    为什么我们不能在类中为方法添加默认值

  19. 19

    为什么我们不能在静态内部类中定义main函数?

  20. 20

    为什么我们不能在构造函数中创建非静态自引用对象

  21. 21

    为什么我们不能在三元运算符中返回?

  22. 22

    为什么我们不能在Java 7+中打开类?

  23. 23

    为什么我们不能在main函数中定义函数?

  24. 24

    为什么我们不能在col标签中设置颜色?

  25. 25

    为什么我们不能在Express.js中执行多个response.send?

  26. 26

    为什么我们不能在决策树中随机启动根节点?

  27. 27

    为什么我们不能在python中更改字符串的特定值

  28. 28

    为什么我们不能在Java的普通方法中调用this()方法?

  29. 29

    为什么我们不能在操作系统的内核中添加最大的功能?

热门标签

归档