• Only the original thread that created a view hierarchy can touch its views解决办法


    这周操作系统作业布置了一个作业,内容是做个小软件,来模拟消费者生产者问题,作业实现起来不来,因为之前写过这个算法,所以关键步骤就是在消费和生产的时候更新缓存区的UI控件就行,之后问题就来了,出现了标题中的问题,现在分析一下

    Only the original thread that created a view hierarchy can touch its views
    这句话的意思是,只有创建这个view的原始线程才能接触到它,意思就是我UI控件的更新不在原始线程里面,我源码这样的
    //Producter.java
    switch (producter.charAt(producter.length()-1)){
                    case '0':
                        view0.setImageResource(R.drawable.goods);
                        Log.d("生产者:我做了",producter);
                        break;

    其实到这里我大概知道了我为什么错了,可是又不想重写逻辑,换到主线程来改UI,于是查了一下资料,在安卓中,UI更新不是线程安全的,所以只能在主线程中更新UI,那么,到底有没有问题在子线程中更新UI呢,答案肯定是可以的,我找到了一个办法,那就是通过View类中的post函数来更新,首先我把做法的源码贴上来

    switch (producter.charAt(producter.length()-1)){
                    case '0':
                        view0.post(new Runnable() {
                            @Override
                            public void run(){
                                view0.setImageResource(R.drawable.goods);
                                Log.d("生产者:我做了",producter);
                            }
                        });
                        break;

    可以看到,这里启动了一个新的线程,但是,问题来了,为什么这样就可以了?UI更新不还是在非主线程中吗?

    说实话我想了挺久没想太明白,看了一下view.post的源码也没整得太明白,可能因为我接触安卓不太久的原因,火候还不够,但是问题摆在这里还是得解决...我还是贴个大佬很详细的讲解吧

    【Android源码解析】View.post()到底干了啥

    里面有很详细的代码讲解,一行一行跟进的

    另外,还贴几个更新在子线程中更新UI的方法

    安卓在子线程更新UI的几种方法


  • 相关阅读:
    Vue Router基础
    Bootstrap4入门
    React性能优化
    Koa,React和socket.io
    RN-进阶
    RN-入门基础
    RN-环境配置
    React高级指引
    React基础概念
    实现A-Z滑动检索菜单
  • 原文地址:https://www.cnblogs.com/Yintianhao/p/9157400.html
Copyright © 2020-2023  润新知