常用设计模式?
一个是单例模式,双重检查模式(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,就没有拦截的方法.

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 -是-> 任务队列是否已满 -是-> 线程数是否达到最大线程数 -是-> 执行饱和策略.
-否-> 创建核心线程执行任务 -否-> 将任务加在任务队伍中 -否-> 创建非核心线程执行任务
网友评论