其他分享
首页 > 其他分享> > 都说衣不如新人不如故,技术是学新不学旧的?IPC+view+Handler+线程。

都说衣不如新人不如故,技术是学新不学旧的?IPC+view+Handler+线程。

作者:互联网

刚刚过去2019,新的一年2020年。都说衣不如新人不如故,技术是学新不学旧的?可是旧的知识不巩固,根基不固很容易在面试或者实战遇到很大的问题的

以下知识点PDF版后续可见
都说衣不如新人不如故,技术是学新不学旧的?IPC+view+Handler+线程。

更多面试内容等等
(更多完整项目下载。未完待续。源码。图文知识后续上传github。)
(VX:mm14525201314)
https://github.com/xiangjiana/Android-MS

一丶线程篇

1、线程池的好处? 四种线程池的使用场景,线程池的几个参数的理解?

参考答案
使用线程池的好处是减少在创建和销毁线程上所花的时间以及系统资源的开销,解决资源不足的问题。如果不使用线程池,有可能造成系统创建大量同类线程而导致消耗完内存或则“过度切换”的问题,归纳总结就是

Android 中的线程池都是直接或间接通过配置
ThreadPoolExecutor 来实现不同特性的线程池.Android 中最常见的类具有不同特性的线程池分别为:

通过源码可以了解到上面的四种线程池实际上还是利用ThreadPoolExecutor 类实现的

  //详细介绍课参考Executors.java类
  public static ExecutorService newCachedThreadpool () {
         return new ThreadPoolExecutor (0,Integer.MAX_VALUE
                                        60L,TimeUnit.SECONDS,
                                        new SynchronousQueue<Runnable>());
  }
  ThreadPoolExecutor(int corepoolSize,int maxmumpoolSize,
                     long keepAliveTime,TimeUnit unit,
                     Blockingqueue<Runnable>workqueue,RejectedExecutionHandler handler
2、Android 中还了解哪些方便线程切换的类?

参考回答:

3、 AsyncTask 的原理

参考回答:

4、IntentService 有什么用 ?

IntentService 可用于执行后台耗时的任务,当任务执行完成后会自动停止,同时由于 IntentService 是服务的原因,不同于普通 Service,IntentService 可自动创建子线程来执行任务,这导致它的优先级比单纯的线程要高,不容易被系统杀死,所以IntentService 比较适合执行一些高优先级的后台任务。

5、直接在 Activity 中创建一个 thread 跟在 service 中创建一个 thread 之间的区别?

参考回答:

6、ThreadPoolExecutor 的工作策略 ?

参考回答: ThreadPoolExecutor 执行任务时会遵循如下规则

8、ThreadLocal 的原理

参考回答:
ThreadLocal 是一个关于创建线程局部变量的类。使用场景如下所示:

当需要使用多线程时,有个变量恰巧不需要共享,此时就不必使用 synchronized 这么麻烦的关键字来锁住,每个线程都相当于在堆内存中开辟一个空间,线程中带有对共享变量的缓冲区,通过缓冲区将堆内存中的共享变量进行读取和操作,ThreadLocal 相当于线程内的内存,一个局部变量。每次可以对线程自身的数据读取和操作,并不需要通过缓冲区与 主内存中的变量进行交互。并不会像 synchronized 那样修改主内存的数据,再将主内存的数据复制到线程内的工作内存。ThreadLocal 可以让线程独占资源,存储于线程内部,避免线程堵塞造成 CPU 吞吐下降。

在每个 Thread 中包含一个 ThreadLocalMapThreadLocalMap 的 key 是 ThreadLocal 的对象,value 是独享数据。

9、多线程是否一定会高效(优缺点)

参考回答:
多线程的优点:

多线程的缺点:

综上得出,多线程不一定能提高效率,在内存空间紧张的情况下反而是一种负担,因此在日常开发中,应尽量

10、多线程中,让你做一个单例,你会怎么做

参考回答:

12、什么是 ANR ? 什么情况会出现 ANR ?如何避免 ? 在不看代码的情况下如何快速定位出现 ANR 问题所在 ?

参考回答:

二丶Handler篇

1、谈谈消息机制 Handler 作用 ?有哪些要素 ?流程是怎样的 ?

参考回答:
负责跨线程通信,这是因为在主线程不能做耗时操作,而子线程不能更新 UI,所以当子线程中进行耗时操作后需要更新 UI时,通过 Handler 将有关 UI 的操作切换到主线程中执行。

具体分为四大要素

流程:
都说衣不如新人不如故,技术是学新不学旧的?IPC+view+Handler+线程。

2、一个线程能否创建多个 Handler,Handler 跟 Looper 之间的对应关系 ?

参考回答:

3、软引用跟弱引用的区别

参考回答:

解决方案:将 Handler 定义成静态的内部类,在内部持有Activity 的弱引用,并在 AcitivityonDestroy()中调用 handler.removeCallbacksAndMessages(null)及时移除所有消息。

5、为什么系统不建议在子线程访问 UI?

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

这时你可能会问为何系统不对 UI 控件的访问加上锁机制呢?因为

6、Looper 死循环为什么不会导致应用卡死?

参考回答:

7、使用 Handler 的 postDealy 后消息队列会有什么变化?

参考回答:
如果队列中只有这个消息,那么消息不会被发送,而是计算到时唤醒的时间,先将 Looper 阻塞,到时间就唤醒它。但如果此时要加入新消息,该消息队列的对头跟 delay 时间相比更长,则插入到头部,按照触发时间进行排序,队头的时间最小、队尾的时间最大

8、可以在子线程直接 new 一个 Handler 吗?怎么做?

参考回答:
不可以,因为在主线程中,Activity 内部包含一个 Looper 对象,它会自动管理 Looper,处理子线程中发送过来的消息。而对于子线程而言,没有任何对象帮助我们维护 Looper 对象,所以需要我们自己手动维护。所以要在子线程开启 Handler 要先创建 Looper,并开启 Looper 循环

  //代码示例
  new Thread(new Runnable() {
             @Override
             public void run() {
                looper.prepare();
                new Handler() {
                    @Override
                     public void handlerMessage(Message msg) {
                        super.handleMessage(msg);
                     }
                     looper.loop();
                }
     }).start();
9、Message 可以如何创建?哪种效果更好,为什么?

参考回答: 可以通过三种方法创建:

后两者效果更好,因为 Android 默认的消息池中消息数量是 10,而后
两者是直接在消息池中取出一个 Message 实例,这样做就可以避免多
生成 Message 实例。

三丶IPC

1 丶Android 中进程和线程的关系和区别?

参考回答:

2 、如何开启多进程 ? 应用是否可以开启 N 个进程 ?

参考回答:

一般来说,使用多进程通信会造成如下几方面的问题

4 丶Android 中 IPC 方式、各种方式优缺点,为什么选择 Binder

参考回答:
都说衣不如新人不如故,技术是学新不学旧的?IPC+view+Handler+线程。
与 Linux 上传统的 IPC 机制,比如 System V,Socket 相比,Binder 好在哪呢?
传输效率高、可操作性强: 传输效率主要影响因素是内存拷贝的次数,拷贝次数越少,传输速率越高。从 Android进程架构角度分析:对于消息队列、Socket 和管道来说,数据先从发送方的缓存区拷贝到内核开辟的缓存区中,再从内核缓存区拷贝到接收方的缓存区,一共两次拷贝,如图:
都说衣不如新人不如故,技术是学新不学旧的?IPC+view+Handler+线程。
而对于 Binder 来说,数据从发送方的缓存区拷贝到内核的缓存区,而接收方的缓存区与内核的缓存区是映射到同一块物理地址的,节省了一次数据拷贝的过程,如图:
都说衣不如新人不如故,技术是学新不学旧的?IPC+view+Handler+线程。
由于共享内存操作复杂,综合来看,Binder 的传输效率是最好的。

实现 C/S 架构方便: Linux 的众 IPC 方式除了 Socket 以外都不是基于 C/S 架构,而 Socket 主要用于网络间的通信且传输效率较低。Binder 基于 C/S 架构 ,Server 端与Client 端相对独立,稳定性较好。
安全性高: 传统 Linux IPC 的接收方无法获得对方进程可靠的 UID/PID,从而无法鉴别对方身份;而 Binder 机制为每个进程分配了 UID/PID 且在 Binder 通信时会根据UID/PID 进行有效性检测。

5 、Binder机制的左右和原理

参考回答:
Linux 系统将一个进程分为 用户空间和 内核空间。对于进程之间来说,用户空间的数据不可共享,内核空间的数据可共享,为了保证安全性和独立性,一个进程不能直接操作或者访问另一个进程,即 Android 的进程是相互独立、隔离的,这就需要跨进程之间的数据通信方式
都说衣不如新人不如故,技术是学新不学旧的?IPC+view+Handler+线程。
一次完整的 Binder IPC 通信过程通常是这样:

6 、Binder 框架中 ServiceManager的作用

参考回答:

7丶Bundle 传递对象为什么需要序列化?Serialzable 和 Parcelable

参考回答:

8 、讲讲 AIDL ?原理是什么?如何优化多模块都使用 AIDL

参考回答:
AIDL(Android Interface Definition Language,Android接口定义语言):如果在一个进程中要调用另一个进程中对象的方法,可使用 AIDL 生成可序列化的参数,AIDL 会生成一个服务端对象的代理类,通过它客户端实现间接调用服务端对象的方法

AIDL 的本质是系统提供了一套可快速实现 Binder 的工具。关键类和方法:

当有多个业务模块都需要 AIDL 来进行 IPC,此时需要为每个模块创建特定的 aidl 文件,那么相应的 Service 就会很多。必然会出现系统资源耗费严重、应用过度重量级的问题。解决办法是建立 Binder 连接池,即将每个业务模块的Binder 请求统一转发到一个远程 Service 中去执行,从而避免重复创建 Service。

工作原理: 每个业务模块创建自己的 AIDL 接口并实现此接口,然后向服务端提供自己的唯一标识和其对应的 Binder 对象。服务端只需要一个 Service,服务器提供一个 queryBinder 接口,它会根据业务模块的特征来返回相应的 Binder 对象,不同的业务模块拿到所需的 Binder 对象后就可进行远程方法的调用了

查看完整的PDF版
(更多完整项目下载。未完待续。源码。图文知识后续上传github。)
可以联系我获取完整PDF
https://github.com/xiangjiana/Android-MS
(VX:mm14525201314)

都说衣不如新人不如故,技术是学新不学旧的?IPC+view+Handler+线程。

标签:学新,IPC,不如,Binder,Handler,线程,Looper,进程,消息
来源: https://blog.51cto.com/14541311/2463944