你的真的能回答上Handler的面试题???

综合技术 2018-02-24

老婆保佑,代码无BUG

前言

这是个很多人都会问的面试题,由这个面试题,再次了解hanlder运行机制

一:什么是Handler

Handler是Android提供用来更新UI的一套机制,也是一套消息处理机制,可以用它来发送消息,也可以用它来接收消息。

问:什么是消息处理机制?

答:不同线程之间的通信

问:安卓的消息机制有什么用?

答:避免ANR(Application Not Responding) ,一旦发生ANR,程序就挂了,奔溃了。

问:ANR是什么,怎么触发ANR

答:程序无响应,在activity中超过5秒的时间未能响应下一个事件

,BroadcastReceive超过10未响应,程序会抛出ANR异常

问: 如何避免ANR

答:主线程更新UI界面,子线程执行耗时操作

问:为什么系统不允许子线程更新UI?

答:UI控件不是线程安全的,在多线程中并发访问可能会导致UI控件处于不可预期的状态

问:什么是线程安全?线程不安全?

答:

  • 线程安全

    多线程访问时,采用了加锁机制,当一个线程访问该类的某个数据时,进行保护,其他线程不能进行访问直到该线程读取完,其他线程才可使用。不会出现数据不一致或者数据污染。

  • 线程不安全

    不提供数据访问保护,有可能出现多个线程先后更改数据造成所得到的数据是脏数据

那为什么不对UI控件的访问加上 上锁机制 呢

答:

  • 上锁会让UI控件变得复杂和低效
  • 上锁后会阻塞某些进程的执行

二:描述Handler,Looper,MessageQueue,Message之间的关系

  • 1.Handler和Looper

    当Handler实例化的时候,Looper会自动关联Handler所在线程,如果Looper什么都不设置,默认关联的就是主线程

  • 2.Looper和MessageQueue

    当Looper实例化的时候,会内部初始化MessageQueue消息队列, 消息队列如果和主线程管理,是打开的,如果不是主线程要自己操作 (打开就能接受消息,不打开就不接受消息).专门有控制的标志变量

  • 3.Handler和Message

    可以对Meassage操作,发送,删除

  • 4.Handler和MessageQueue

    Handler发送消息由MessageQueue统一处理,MessageQueue通过回到方法可以确认该消息已经处理过了

    是通过回调接口调用的回调方法

  • 5.Message和MessageQueue

    MessageQueue专门处理Message

总结

当我们初始化Handler的时候,会初始化Looper, 初始化Looper时候,会创建一个MessageQueue,handler发送message,在MessageQueue进行处理

handler 工作图

三:Handler使用

1. post(Runnable)

private void init_Hanlder() {
        final Handler handler = new Handler();
        new Thread(new Runnable() {
            @Override
            public void run() {
                //耗时操作
                handler.post(new Runnable() {
                    @Override
                    public void run() {
                        //UI 线程
                    }
                });
            }
        }).start();
    }

2. sendMessage(Message)

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        new WorkThread().start();
    }

 public class WorkThread extends Thread {
        @Override
        public void run() {
            super.run();
            //耗时操作
            try {
                Thread.sleep(1000 * 5);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

            Message message = new Message();
            message.what = 1;
            message.obj = "message 1";
            handler.sendMessage(message);
        }
    }


    private Handler handler = new Handler(new Handler.Callback() {
        @Override
        public boolean handleMessage(Message msg) {
            switch (msg.what) {
                case 1:
                    Log.e("TAG", "msg: " + msg.obj.toString());
                    break;
                default:
                    break;
            }
            return false;
        }
    });

四:Handler 内存泄漏问题

Handler造成Activity泄漏,用弱引用真的有用么?

五:源码查看

Handler 之 源码解析

您可能感兴趣的

SQLiteDatabase学习(二) 前言 今天主要讲讲sqlite在android中的创建,存储 和 sqlite的增删改查。 下面以一个例子做讲解 一 创建数据库,需要继承SQLiteOpenHelper 下面是创建user数据库的类DBOpenHelper package com.example.pei.tex...
关于Android的定位服务 今天因为工作需要,把以前编写的一个GPS测试程序拿出来重新修改了一下。这个程序说起来有些历史了,是我11年编写的,那时候学了Android开发没多久,算是一个实验性的作品。现在工作需要,重新拿出来修整。同时发现我对android的GPS服务了解并不深,所以今天特意阅读了有关GPS服务的一些资料,把相...
DeviceInfo采集android设备信息工具 库介绍 功能 采集Android设备信息,以Json形式输出 可自由定制要采集的设备类型,显示的设备信息详情等 特性 通过继承 BaseDeviceInfoCollector 类,配合 DeviceInfoManager 以获取任意设备信息 ...
Android基础:sha256的java与c代码实现 芳华,文工团要解散了 因为业务需求,需要把加密的代码从c上移到java层实现。这篇文章记录一下。 推荐: http://www.dooccn.com/java1.7/ https://www.cnblogs.com/yangyi9343/p/5775...
Android资源标签属性及优先级(一) 在写前一篇文章 浅述Android Apk打包流程 的时候发现解压后的apk里res的资源文件,有多于我本地项目中的res资源文件夹。 解压后的apk里res资源文件 Project模式下本地res的资源文件 ...
0
简书

责编内容来自:简书 (本文源链)
阅读提示:酷辣虫无法对本内容的真实性提供任何保证,请自行验证并承担相关的风险与后果!
本站遵循[CC BY-NC-SA 4.0]。如您有版权、意见投诉等问题,请通过eMail联系我们处理。