Android 之 更新UI机制

1.子线程是可以更新UI的:

1.1 例如更新Toast,但是这样代价有大,需要先创建一个Looper,而且还是只针对toast,其他的view根本不行;

 

   new Thread(){
            @Override
            public void run() {
                super.run();
                Looper.prepare();
                looper = Looper.myLooper();
                Toast.makeText(MainActivity.this,"ahahahahj++++++++++",Toast.LENGTH_SHORT).show();
                Looper.loop();
            }
        }.start();

1.2 要在子线程更新UI,不用创建looper,但是必须在页面初始化获取焦点OnResume之间修改,因为系统在OnResume方法中会创建ViewRootImpl对象在对象中保存了创建者的当前线程(UI线程),这个类只有系统调用,开发者是找不这个类的;这对象中有一个checkThread方法,会检查调用更新UI的当前线程和这个对象之前保存的创建ViewRoot对象的线程是否一致;不一致就会先异常;所以在OnResume之前更改UI是因为ViewRoot还没创建出来;

 

1.3 在子线程中是可以更新ProgressBar进度的,不用创建looper,源码中仅对此没有做线程判断;很奇怪,不知其意何为;

 

 

2.Android是单线程模式

当一个程序第一次启动的时候,Android会同时启动一个对应的主线程,这个主线程就是UI线程,也就是ActivityThread。UI线程主要负责处理与UI相关的事件,如用户的按键点击、用户触摸屏幕以及屏幕绘图等。系统不会为每个组件单独创建一个线程,在同一个进程里的UI组件都会在UI线程里实例化(也不是绝对的在子线程中也能创建UI组件,但是当这个组件添加到布局上时,这个组件就已经被标识是UI线程组件,不能再子线程中更新了),系统对每一个组件的调用都从UI线程分发出去。所以,响应系统回调的方法永远都是在UI线程里运行。

那为什么是单线程呢?其实很简单因为线程不安全啊,如果同时有多个线程去更新一个view的视图的话,怎么办,刷新不同步。单线程就很好的解决了这个问题,在线程中使用消息队列机制,要更新UI就发送消息,主线程一个一个的消息处理就ok了;

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值