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()的检查。

 

 

 

     

你可能感兴趣的:(APP开发,ios,android,Android面试准备)