美文网首页
面试回答

面试回答

作者: 神的漾 | 来源:发表于2020-11-09 00:19 被阅读0次

常用设计模式?

一个是单例模式,双重检查模式(volatile),推荐静态内部类

public static Singleton getInstance() {
        return SingletonHolder.SINGLETON;
    }

    private static class SingletonHolder {
        private static final Singleton SINGLETON = new Singleton();
    }

静态代理模式,比较适合能实现相同接口的方式,比如直播推流,和观看.音频直播和视频直播.
因为是进入才知道当前身份,所以用代理模式,接口动作相同.
1.真实主题类就是实现实际的业务逻辑,不用关心其它非本职的工作.
2.真实主题类随时都会发生变化;但是因为它实现了公共的接口,所以代理类可以不做任何修改就能够使用.

IShop hanjinlong = new Hanjinlong();
        IShop purchasing = new Purchasing(hanjinlong);
        purchasing.buy();

一个是builder模式,适合那种

性能优化做了什么?

减少层级,减少过度绘制使用constralayout,Merge.原来是红的,后变白了,就是写的代码变多了
公司封装的recyclerview,发现闪烁或卡,发现是多次调用notify,使用diffutil
启动优化,设置windowbackgroud.图片.
启动优化,将一些不需要马上初始化的放入子线程初始化,比如xray
只保留一种armv7a的so
LeakCanary检测内存泄漏,debug时打进去.
Crash监控
安装包大小优化.小图tinypng,大图webp webp有些小图转换后变大.
使用字体缩小,比如只展示数字,就去生成用到的包.蜘蛛的

组件化理解?

我理解其实应该叫做模块化.
组件是指一个一个比如点赞按钮.一个功能,io数据库,网络,一个启动页等都是组件.
一处封装处处使用,我封装了音视频推流功能.代理 模式.
基本上分为:基础功能组件,通用UI组件,基础业务组件.
模块化单独运行,减少调试时间.每个模块可以单独运行,可以上传到仓库.
我希望的是收集到所有activity到一个列表,我也有用apt尝试,是只能在3.6.3上运行.
应用层:APP(壳工程)
生成APP和加载初始化操作。

模块层:Login Pay Live (modules)
每个模块相当于一个业务,通过module来分隔每个业务的逻辑,一个模块由多个不同的页面逻辑组成。

基础层:Base (base)
基础组件的整合,提供基础组件能力给业务层使用。(将底层引用封装起来给上层调用,方便接口化)

组件层:image network ... (components)
将图片加载、网络HTTP、Socket等基础功能划分为一层。

基础库层:Lib (core) 依赖了一些子modules都要用的.
更加基础的库类依赖,此层非必须,例如Rxjava、EventBus等一些代码结构优化的库,还有自己编写的封装类。

组件化如何传递消息?

用eventBus

事件传递?

Activity--> Window-->DecorView --> 布局View
分发:dispatchTouchEvent;
如果当前view包含的子view的dispatchTouchEvent方法或者当前view的onTouchEvent处理了事件,就返回true表示事件被消费了
拦截:onInterceptTouchEvent;
判断某个事件是否需要拦截,如果某个view拦截了此事件,那么同时个事件序列中.此方法不会被再调用
处理:onTouchEvent;
用来处理事件,如果事件被消耗了,就会返回true,不处理就返回false.并且在同一个时间序列中,当前view不会再接受到事件.
如果是viewGroup三个方法都会用到,如果是View类型,不能包含子view,就没有拦截的方法.


image.png

MVP,MVC区别?

MVP模式:
1.View不直接与Model交互,而是通过与Presenter交互来与Model间接交互
2.Presenter与View的交互是通过接口来进行的,更有利于添加单元测试
3.通常View与Presenter是一对一的,但复杂的View可能绑定多个Presenter来处理逻辑,业务相似的时候也可以多同个View共享一个Presenter。
MVC模式:
1.View可以与Model直接交互
2.Controller是基于行为的,并且可以被多个View共享
3.Controller可以负责决定显示哪个View

线程池

线程池:
ThreadPoolExecutor:
publick ThreadPoolExecutor(
int corePoolSize,:核心xgtkovt.默认情况是空的,只有任务提交才会创建线程.如果当前运行的线程数少于corePoolSize,则创建新线程来处理任务.
如果等于或多于corePoolSize,则不再创建.如果调用prestartAllcoreThread方法,线程池会提前创建并启动所有核心线程来等待任务.
int maximumPoolSize,:线程池允许创建的最大线程数,如果任务队列满了并且线程数小于maximumPoolSize时,则线程池仍旧会创建新的线程来处理任务.
long keepAliveTime,:非核心线程闲置的超时时间.超过这个时间则回收,如果任务很多,并且每个任务的执行事件很短,则可以调大keepAliveTime提高线程利用率
另外,如果设置allowCoreThreadTimeOut属性为true时,keepAliveTime也会应用到核心线程上.
TimeUnit unit,:keepAliveTime参数的时间单位
BlockingQueue workQueue,:任务队列.如果当前线程数大于corePoolSize,则将任务添加到此任务队列中.是一个阻塞队列.
ThreadFactory threadFactory,:线程工厂.可以用这个给每个创建出来的线程设置名字.一般无须设置该参数.
RejectedExecutionHandler handler):饱和策略(拒绝执行handler).这时当前任务队列和线程池都满了时所采取的应对策略,默认是AbordPolicy,
表示无法处理新任务.并抛出异常.还有其它三种策略:
1.CallerRunsPolicy:用调用者所在的线程来处理任务.此策略提供简单的反馈控制机制,能够减缓新任务的提交速度.
2.DiscardPolicy:不能执行的任务,并将该任务删除.
3.DiscardOldestPolicy:丢弃队列最近的任务,并执行当前的任务.

原理:
提交任务 -> 线程是否达到corePoolSize -是-> 任务队列是否已满 -是-> 线程数是否达到最大线程数 -是-> 执行饱和策略.
-否-> 创建核心线程执行任务 -否-> 将任务加在任务队伍中 -否-> 创建非核心线程执行任务

相关文章

  • 面试回答

    JAVA 1. completableFuture 2. stream

  • 面试回答

    常用设计模式? 一个是单例模式,双重检查模式(volatile),推荐静态内部类 静态代理模式,比较适合能实现相同...

  • 高可用大纲

    面试之道又当过面试者又当过面试官,讲讲面试官的心里状态以及什么样的面试回答是个好回答,而不是只追求正确回答 幂等讲...

  • 面试回答内容

    问一段话给你什么启示,先说自己对这句话的理解,然后论证一下这句话的意义,最后结合自身,说说对自己的启发。 仔细审题...

  • 回答 | 4道过滤菜鸟的iOS面试题

    回答 | 4道过滤菜鸟的iOS面试题 回答 | 4道过滤菜鸟的iOS面试题

  • 前端面试之一问一答套路

    其实不光前端面试会有问答环节,在任何的面试上都有面试官提出问题,你回答,或者你提出问题面试官回答的环节,由于本人应...

  • 三种方法解析面试官提问意图,让你的面试效果倍增

    面试就是通过两个人面对面的交流,考察求职者回答背后的能力展现。 面试时面试官到底在考察什么?这是回答面试提问时需要...

  • 面试中的问题该如何巧妙回答?

    面试中如何回答提问,很影响此次面试的结果,回答的好留下的映象好,薪资高;回答的不好也许只能留下这么个短暂的映象。 ...

  • 破解面试中,最难回答的25个问题

    面试常遇到一些纠结的问题,回答稍有不慎,就跳进面试陷阱,让你落败。以下总结了面试中最难回答的25个问题,帮助你在面...

  • 通过Android面试之旅案例,让你了解面试职场的逻辑和技巧

    前言 写了许多面试文章,缺没有写过面的逻辑与技巧,今天就来写一篇。 想必许多人在面试中觉得自己回答面试官的问题回答...

网友评论

      本文标题:面试回答

      本文链接:https://www.haomeiwen.com/subject/vmqkbktx.html