- 博客(50)
- 收藏
- 关注
原创 2019-2020年实习+秋招面经(客户端)
前言有一年没写博客了,从去年年底就开始找实习,最后去了字节,实习到快九月份转正答辩完才回来准备秋招,因为准备的太晚,很多公司都结束了提前批,最后只面了腾讯。希望自己的面经能给大家一些参考。实习-字节跳动头条一面 - 2019.12.13SharedPreferencescomit、apply的区别 使用场景 怎么存的 有没有缓存 存在哪,以哪种文件类型存储的Handler原理、工作流程、postDelayed、IdleHandler的使用场景Activity启动模式onNewIntent
2020-11-27 16:42:06
187
1
原创 ijkplayer视频解码与播放
视频解码在数据读取线程中,视频解码线程的创建是:SDL_CreateThreadEx(&is->_video_tid, video_thread, ffp, "ff_video_dec");在它创建之后有一个死循环:for (;;) { if (is->abort_request) break; //ignore...
2019-12-01 22:04:01
1612
原创 ijkplayer音频解码与播放
解码线程音频解码线程的入口函数是audio_thread()static int audio_thread(void *arg){//... do { ffp_audio_statistic_l(ffp); if ((got_frame = decoder_decode_frame(ffp, &is->auddec, frame, NU...
2019-12-01 16:26:30
2100
原创 ijkplayer数据读取
在IjkMediaPlayer_prepareAsync()中它创建了几个线程:视频显示线程数据读取线程消息循环处理线程数据读取线程数据读取线程是在stream_open()函数中创建的,把里面函数可以精简为下面几行:static VideoState *stream_open(FFPlayer *ffp, const char *filename, AVInputFormat *...
2019-11-30 22:59:52
1056
原创 ijkplayer初始化流程
ijkplayer 集成了三种播放器实现:AndroidMediaPlayer:即安卓系统自带的播放器 MediaPlayer,基于 MediaCodec、AudioTrack 等安卓系统 API.IjkExoMediaPlayer:即谷歌新推出的 ExoPlayer,同样是基于 MediaCodec、AudioTrack 等安卓系统 API,但相比 MediaPlayer 具有支持 DAS...
2019-11-29 23:21:06
710
原创 HashMap源码
哈希 哈希函数 哈希表HashHash又称散列,散列是与排序相反的一种操作,排序是将集合中的元素按照某种方式比如字典顺序排列在一起,而散列通过计算哈希值,打破元素之间原有的关系,使集合中的元素按照散列函数的分类进行排列。哈希 其实是随机存储的一种优化,先进行分类,然后查找时按照这个对象的分类去找。 哈希通过一次计算大幅度缩小查找范围,自然比从全部数据里查找速度要快。为什么要有Hash?...
2019-11-23 16:26:59
122
原创 ArrayList源码
定义ArrayList实际上是一个动态数组,容量可以动态增长public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, java.io.SerializableRandomAccess接口,标记接口,被Li...
2019-11-19 16:43:14
106
原创 Handler机制(Native层)
在Android消息处理机制中,不仅包括了Java层的消息机制处理,还包括了Native消息处理机制(也拥有Handler、Looper、MessageQueue)Java层的MessageQueue中声明了几个本地方法: private native static long nativeInit(); private native static void nativeDest...
2019-11-16 23:06:49
534
原创 Handler机制(java层)
Handler、MessageQueue、Looper之间的关系每个线程只会有一个Looper对象。Handler的创建是和Looper的创建在同一线程中,Looper内部维护了一个MessageQueue(消息队列),该队列内部是通过单链表的形式实现的。Handler通过sendMessage()将消息发送到Looper对应的MessageQueue中,Looper通过消息循环获取消息后,会调...
2019-11-13 21:22:46
1754
原创 ThreadLocal的工作原理
概述是一个线程内部的数据存储类(泛型类)public class ThreadLocal ,可以在指定的线程中存取数据,Looper、ActivityThread以及AMS中都用到了ThreadLocal。当某些数据是以线程为作用域并且不同线程具有不同的数据副本的时候,就可以考虑采用ThreadLocal。ThreadLocal封装了对当前线程的ThreadLocalMap存取,存取数据的实质...
2019-11-08 18:28:13
177
原创 Glide源码--缓存机制
Glide在缓存功能上也是分成了两个模块,一个内存缓存,一个硬盘缓存。内存缓存的主要作用是防止应用重复将图片数据读取到内存当中,硬盘缓存的主要作用是防止应用重复从网络或其他地方重复下载和读取数据。缓存的图片资源分为两类:原始图片和转换后的图片(经过尺寸缩放和大小压缩等处理后的图片)内存缓存只缓存转换过后的图片,而硬盘缓存可缓存原始图片和转换过后的图片,用户自行设置缓存key决定缓存key...
2019-11-05 15:59:05
178
原创 Glide源码--执行流程
Glide的基本使用看一下郭神的博客,Android图片加载框架最全解析(八),带你全面了解Glide 4的用法图片加载机制的基本流程我们从这行代码看起Glide.with(this).load(url).into(imageView);1. with()Glide会根据我们传入with()方法的参数来确定图片加载的生命周期。(避免消耗多余的资源,也避免在Activity销毁后加载图...
2019-11-01 13:49:36
235
原创 Java内存区域
运行时数据区域Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域。程序计数器可以看作是当前线程所执行的字节码的行号指示器,是一块较小的内存空间。(线程私有)如果线程正在执行的是java方法,计数器记录的是正在执行的虚拟机字节码指令的地址;如果正在执行的是native方法,这个计数器值则为空字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执...
2019-10-25 17:05:03
110
原创 计算机网络--应用层
DNS计算机(ip地址)下正在通信的应用进程会得到一个端口号DNS产生原因:IP地址难于记忆,可使用符号地址,比如用www.hh.edu表示210.28.39.92。网络本身是使用IP地址的,因此需要一个完成二者之间相互转化的机制。因此就产生的域名系统DNS。DNS:将域名解析成IP域名完整的域名最长255个字符每部分最长63个字符不区分大小写注:mail.163.com:这...
2019-10-23 22:58:53
206
原创 OkHttp源码--缓存
HTTP的缓存规则可分为两大类:强制缓存对比缓存不同点就是:强制缓存如果生效(有缓存数据且未失效),不需要再和服务器发生交互,,而对比缓存不管是否生效,都需要与服务端发生交互。两类缓存规则可以同时存在,强制缓存优先级高于对比缓存,也就是说,当执行强制缓存的规则时,如果缓存生效,直接使用缓存,不再执行对比缓存规则。强制缓存在没有缓存数据的时候,浏览器向服务器请求数据时,服务器会将数据...
2019-10-23 21:10:57
178
原创 OkHttp源码--网络连接
了解OkHttp的网络部分,包括Socket的创建、连接,连接池等要点。OkHttp对Socket的流操作使用了Okio进行了封装。基础概念HTTP2的多路复用HTTP/2引入二进制数据帧和流的概念,其中帧对数据进行顺序标识,这样浏览器收到数据之后,就可以按照序列对数据进行合并,而不会出现合并后数据错乱的情况。HTTP/2对同一域名下所有请求都是基于流,也就是说同一域名不管访问多少文件,也只...
2019-10-22 20:12:47
318
原创 OkHttp源码--拦截器链
在同步和异步请求中都调用了getResponseWithInterceptorChain(),它返回ResponsegetResponseWithInterceptorChain()拦截器的入口。将client中的拦截器和默认的拦截器都加入到集合中,将其传入创建了一个RealInterceptorChain拦截器链。最后返回chain的proceed()的返回值。Response getR...
2019-10-20 17:05:48
227
原创 OkHttp之拦截器
它可以实现网络监听、请求以及响应重写、请求失败重试等功能.拦截器的作用拦截器可以一次性对所有请求的返回值进行修改拦截器可以一次性对请求的参数和返回的结果进行编码,比如统一设置为UTF-8.拦截器可以对所有的请求做统一的日志记录,不需要在每个请求开始或者结束的位置都添加一个日志操作。其他需要对请求和返回进行统一处理的需求…拦截器的分类分为2个:APP层面的拦截器和网络请求层面的拦截...
2019-10-18 16:49:32
222
原创 OkHttp源码--发送请求
OkHttpClient一般可以通过以下两种方式创建OkhttpClientOkHttpClient client = new OkHttpClient();OkHttpClient client = new OkHttpClient.Builder().build();看一下OkHttpClient构造方法的源码 public OkHttpClient() { // new...
2019-09-23 21:31:49
198
原创 OkHttp源码--整体架构
OkHttp的整体架构大致可以分为以下几层:Interface(接口层):接受网络访问请求Protocol(协议层):处理协议逻辑Connection(连接层):管理网络连接,发送新的请求,接收服务器访问Cache(缓存层):管理本地缓存I/O(I/O层):实际数据读写实现Inteceptor(拦截器层):拦截网络访问,插入拦截逻辑Interface(接口层)接收用户的网络访...
2019-09-21 11:48:25
175
原创 OkHttp之缓存配置
当客户端和服务端不能达成一致的协议,不能要求服务端按照客户端的意愿进行开发缓存之拦截器 class CacheInterceptor implements Interceptor{ @Override public Response intercept(Chain chain) throws IOException { // 每个...
2019-09-21 11:47:51
209
原创 OkHttp的基本使用
OKhttp的post请求和get请求提交键值对 //1.创建OkHttpClient对象 OkHttpClient okHttpClient = new OkHttpClient(); //2.通过new FormBody()调用build方法,创建一个RequestBody,可以用add添加键值对 RequestBody...
2019-09-21 11:46:24
295
原创 理解Window和WindowManager(二)--Window的内部机制
Window是一个抽象的概念,每一个Window都对应着一个View和一个ViewRootImplWindow和View通过ViewRootImpl来建立联系,Window是以View的形式存在。Window的添加过程Window的添加过程需要通过WindowManager的addView来实现,WindowManager是一个接口,它的实现类是WindowManagerImplWindow...
2019-08-13 14:39:54
186
原创 理解Window和WindowManager(一)
Window和WindowManagerWindow是一个抽象类,具体实现是PhoneWindow。Window的具体实现位于WindowManagerService中。所有的视图都是通过Window来呈现的,Window实际是View的直接管理者。创建Window通过WindowManager完成,WindowManager是外界访问Window的入口,WindowManager和Windo...
2019-08-11 18:11:58
197
原创 View的工作流程--draw过程
调用流程performTraversals()里在调用完layout流程后也调用了performDraw()ViewRootImpl # performDraw() private void performDraw() { if (mAttachInfo.mDisplayState == Display.STATE_OFF && !mReportNext...
2019-08-08 17:19:08
339
原创 View的工作流程--layout过程
调用流程layout流程是从performTraversals()开始的,performTraversals()在调用完测量流程后,又调用了performLayout(),这是layout流程的起点。ViewRootImpl # performLayout() private void performLayout(WindowManager.LayoutParams lp, int d...
2019-08-06 20:12:24
117
原创 View的工作流程--measure过程
View的measure过程View的measure过程由其measure方法来完成(final类型)View # measure()public final void measure(int widthMeasureSpec, int heightMeasureSpec) { // ...... // 内部会调用onMeasure() onMeasure(width...
2019-08-05 17:21:02
127
原创 View工作原理--MeasureSpec
MeasureSpec参与了View的measure过程,它在很大程度上决定了View的尺寸规格。(因为父容器影响View的MeasureSpec的创建过程)在测量过程中,系统会将View的LayoutParams根据父容器所施加的规则转换成对应的MeasureSpec,根据这个MeasureSpec测量出View的宽/高(不一定等于最终宽高)注意:MeasureSpec不是唯一由Layou...
2019-08-03 11:57:06
248
原创 View工作原理--ViewRootImpl和performTraversals()
ViewRootImplViewRoot(android 2.2之前的老版本)对应于ViewRootImpl(替代ViewRoot)类,它是连接WindowManager和DecorView的纽带,View的三大流程均是通过ViewRoot完成的。当Activity对象被创建完毕后,会将DecorView添加到Window中,同时会创建ViewRootImpl对象,并将ViewRootImpl对...
2019-08-02 16:28:45
2640
原创 Android自定义视频播放器(一)--SurfaceView
双缓冲机制CPU访问内存的速度要远远快于访问屏幕的速度每次都一个个从内存中读取图形然后绘制到屏幕就会造成多次地访问屏幕第一层缓冲先在内存中将所有的图像都绘制到一个Bitmap对象上,然后一次性将内存中的Bitmap绘制到屏幕 @Override protected void onDraw(Canvas canvas) { canvas.drawRect(...
2019-07-31 16:51:31
471
原创 View的事件分发机制(二)--View的源码分析
dispatchTouchEvent()源码public boolean dispatchTouchEvent(MotionEvent event) { // If the event should be handled by accessibility focus first. // 事件可以获取焦点 if (event.isTargetAcce...
2019-07-29 09:36:23
105
原创 View的事件分发机制(一)--ViewGroup的dispatchTouchEvent源码分析
解析Activity的构成当一个点击事件产生后,事件最先传递给Activity。写Activity时会调用setContentView()方法来加载布局setContentView()方法的实现调用了getWindow().setContentView(layoutResID)getWindow()得到的是一个PhoneWindow(PhoneWindow是继承抽象类Window的)从P...
2019-07-25 20:44:06
343
原创 Android IPC机制(二)Binder的工作机制
Binder的理解Binder是Android中的一个类,它实现了IBinder接口。从各个角度来说明Binder:IPCAndroid FrameworkAndroid应用层是Android中的一种跨进程通信方式;还可以理解为一种虚拟的物理设备,该方式在Linux中没有是ServiceManager连接各种Manager和相应ManagerService的桥梁是客...
2019-06-09 16:15:27
488
原创 Android IPC机制(一)IPC基础概念
IPC简介IPC的含义为进程间通信或者跨进程通信,是指两个进程之间进行数据交换的过程多进程的情况分为两种:1. 一个应用因为某些原因自身需要采用多进程模式来实现2. 当前应用需要向其他应用获取数据Android中的多进程模式开启多进程模式正常情况下,在Android中多进程是指一个应用中存在多个进程的情况。在Android中使用多进程的方法:给四大组件在AndroidM...
2019-06-08 12:28:49
323
原创 Android中使用Handler机制更新UI的两种方法
Android中使用Handler机制更新UI的两种方法Handler.post()在post()方法里更新UIpublic class MainActivity extends Activity { private TextView text; private Handler handler = new Handler(); @Override ...
2019-06-05 08:33:27
1609
原创 View体系
View体系先介绍一下View的部分继承关系和View的6种滑动View的部分继承关系View的滑动layout() 方法 public boolean onTouchEvent(MotionEvent event) { //获取手指触摸点的横纵坐标 int x = (int) event.getX(); int y = (int) ...
2019-06-01 10:51:25
135
原创 Android动画(二)--属性动画
Android动画(二)–属性动画属性动画借助于插值器(Interpolator)和估值器(TypeEvaluator),按照一定变化率对属性值进行操作的机制,变化率就是依赖Interpolator控制,而值操作则是TypeEvaluator控制。与视图动画的区别:属性动画作用的对象可以是任何一个Object对象,也就是说我们完全可以给任意Object对象设置属性动画,而这个对象可以不是...
2019-05-27 23:33:31
154
原创 Android动画(一)--视图动画
视图动画View动画一个非常大的缺陷突显,其不具有交互性。当某个元素发生View动画后,其响应事件的位置依然在动画进行前的地方,所以View动画只能做普通的动画效果,要避免涉及交互操作。透明度变化(AlphaAnimation)位移(TranslateAnimation)缩放(ScaleAnimation)旋转(RotateAnimation)这4个动画类都继承自 Animati...
2019-05-27 23:30:32
164
原创 java之向上造型之后,调用方法的规则
最近做了几道java题,发现自己对向上造型后调用方法这里有点迷所以做了一些总结。 首先说一下向上造型的格式: 父类 父类对象=子类实例;(自动转换)向上造型之后,调用方法的规则:首先哪个类型的引用,它点的只能是他里面出现过的方法名字,子类新加的方法名,父类引用是不能点出这个方法的。其次若子类重写了某个方法,父类点这个方法时父类的方法会被覆盖,调出的是子类重写的方法!重写是虚拟机运行期执...
2018-09-09 09:51:00
1844
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人