android面试之线程、进程、Handler

1、在哪个线程中创建的UI,就要在哪个线程中进行UI更新---(理论上是这样,但也并非一定,参照第五条)

2、子线程中可以使用Handler吗?

      可以。子线程中使用Handler必须进行Looper的prepare()。

Looper.prepare();
Handler handler = new Handler();
handler.post(new Runnable() {
    @Override
    public void run() {
        Toast.makeText(Main2Activity.this, "子线程中的handler", Toast.LENGTH_SHORT).show();
    }
});
Looper.loop();

主线程中不需要,是因为主线程已经默认进行了Looper.prepare(); 和 Looper.loop();

3、Looper.prepare()作用

首先执行Looper的prepare()方法,这个方法有两个作用:一是生成Looper对象,二是把Looper对象和当前线程对象形成键值对(线程为键),存放在ThreadLocal当中,然后生成handler对象,调用Looper的myLooper()方法,得到与Handler所对应的Looper对象,这样的话,handler、looper 、消息队列就形成了一一对应的关系。

4、非UI线程真的不能更新UI吗?

可以的。但是有点取巧。

android在生成页面的同时生成一个ViewRootImpl的对象,这个对象负责检查checkThread线程是否是在主ui线程,当我们尝试使用非ui线程更新视图时,checkThread则抛出异常。

ViewRootImpl这个类是在activity的onResume()方法中创建的。就算在子线程中更新UI,只要在ViewRootImpl创建之前更新UI(比如,程序在执行onCreate方法时,我就去执行setText方法区更新UI),就可以逃避掉checkThread()的检查。

 

 

 

     

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值