
Android
文章平均质量分 94
Egypt_nova
这个作者很懒,什么都没留下…
展开
-
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 · 1751 阅读 · 0 评论 -
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 · 2186 阅读 · 0 评论 -
ijkplayer数据读取
在IjkMediaPlayer_prepareAsync()中它创建了几个线程:视频显示线程数据读取线程消息循环处理线程数据读取线程数据读取线程是在stream_open()函数中创建的,把里面函数可以精简为下面几行:static VideoState *stream_open(FFPlayer *ffp, const char *filename, AVInputFormat *...原创 2019-11-30 22:59:52 · 1130 阅读 · 0 评论 -
ijkplayer初始化流程
ijkplayer 集成了三种播放器实现:AndroidMediaPlayer:即安卓系统自带的播放器 MediaPlayer,基于 MediaCodec、AudioTrack 等安卓系统 API.IjkExoMediaPlayer:即谷歌新推出的 ExoPlayer,同样是基于 MediaCodec、AudioTrack 等安卓系统 API,但相比 MediaPlayer 具有支持 DAS...原创 2019-11-29 23:21:06 · 782 阅读 · 0 评论 -
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 · 587 阅读 · 0 评论 -
Handler机制(java层)
Handler、MessageQueue、Looper之间的关系每个线程只会有一个Looper对象。Handler的创建是和Looper的创建在同一线程中,Looper内部维护了一个MessageQueue(消息队列),该队列内部是通过单链表的形式实现的。Handler通过sendMessage()将消息发送到Looper对应的MessageQueue中,Looper通过消息循环获取消息后,会调...原创 2019-11-13 21:22:46 · 1867 阅读 · 0 评论 -
ThreadLocal的工作原理
概述是一个线程内部的数据存储类(泛型类)public class ThreadLocal ,可以在指定的线程中存取数据,Looper、ActivityThread以及AMS中都用到了ThreadLocal。当某些数据是以线程为作用域并且不同线程具有不同的数据副本的时候,就可以考虑采用ThreadLocal。ThreadLocal封装了对当前线程的ThreadLocalMap存取,存取数据的实质...原创 2019-11-08 18:28:13 · 208 阅读 · 0 评论 -
Glide源码--缓存机制
Glide在缓存功能上也是分成了两个模块,一个内存缓存,一个硬盘缓存。内存缓存的主要作用是防止应用重复将图片数据读取到内存当中,硬盘缓存的主要作用是防止应用重复从网络或其他地方重复下载和读取数据。缓存的图片资源分为两类:原始图片和转换后的图片(经过尺寸缩放和大小压缩等处理后的图片)内存缓存只缓存转换过后的图片,而硬盘缓存可缓存原始图片和转换过后的图片,用户自行设置缓存key决定缓存key...原创 2019-11-05 15:59:05 · 228 阅读 · 0 评论 -
Glide源码--执行流程
Glide的基本使用看一下郭神的博客,Android图片加载框架最全解析(八),带你全面了解Glide 4的用法图片加载机制的基本流程我们从这行代码看起Glide.with(this).load(url).into(imageView);1. with()Glide会根据我们传入with()方法的参数来确定图片加载的生命周期。(避免消耗多余的资源,也避免在Activity销毁后加载图...原创 2019-11-01 13:49:36 · 276 阅读 · 0 评论 -
OkHttp源码--缓存
HTTP的缓存规则可分为两大类:强制缓存对比缓存不同点就是:强制缓存如果生效(有缓存数据且未失效),不需要再和服务器发生交互,,而对比缓存不管是否生效,都需要与服务端发生交互。两类缓存规则可以同时存在,强制缓存优先级高于对比缓存,也就是说,当执行强制缓存的规则时,如果缓存生效,直接使用缓存,不再执行对比缓存规则。强制缓存在没有缓存数据的时候,浏览器向服务器请求数据时,服务器会将数据...原创 2019-10-23 21:10:57 · 216 阅读 · 0 评论 -
OkHttp源码--网络连接
了解OkHttp的网络部分,包括Socket的创建、连接,连接池等要点。OkHttp对Socket的流操作使用了Okio进行了封装。基础概念HTTP2的多路复用HTTP/2引入二进制数据帧和流的概念,其中帧对数据进行顺序标识,这样浏览器收到数据之后,就可以按照序列对数据进行合并,而不会出现合并后数据错乱的情况。HTTP/2对同一域名下所有请求都是基于流,也就是说同一域名不管访问多少文件,也只...原创 2019-10-22 20:12:47 · 352 阅读 · 0 评论 -
OkHttp源码--拦截器链
在同步和异步请求中都调用了getResponseWithInterceptorChain(),它返回ResponsegetResponseWithInterceptorChain()拦截器的入口。将client中的拦截器和默认的拦截器都加入到集合中,将其传入创建了一个RealInterceptorChain拦截器链。最后返回chain的proceed()的返回值。Response getR...原创 2019-10-20 17:05:48 · 254 阅读 · 0 评论 -
OkHttp之拦截器
它可以实现网络监听、请求以及响应重写、请求失败重试等功能.拦截器的作用拦截器可以一次性对所有请求的返回值进行修改拦截器可以一次性对请求的参数和返回的结果进行编码,比如统一设置为UTF-8.拦截器可以对所有的请求做统一的日志记录,不需要在每个请求开始或者结束的位置都添加一个日志操作。其他需要对请求和返回进行统一处理的需求…拦截器的分类分为2个:APP层面的拦截器和网络请求层面的拦截...原创 2019-10-18 16:49:32 · 263 阅读 · 0 评论 -
OkHttp源码--发送请求
OkHttpClient一般可以通过以下两种方式创建OkhttpClientOkHttpClient client = new OkHttpClient();OkHttpClient client = new OkHttpClient.Builder().build();看一下OkHttpClient构造方法的源码 public OkHttpClient() { // new...原创 2019-09-23 21:31:49 · 231 阅读 · 0 评论 -
OkHttp源码--整体架构
OkHttp的整体架构大致可以分为以下几层:Interface(接口层):接受网络访问请求Protocol(协议层):处理协议逻辑Connection(连接层):管理网络连接,发送新的请求,接收服务器访问Cache(缓存层):管理本地缓存I/O(I/O层):实际数据读写实现Inteceptor(拦截器层):拦截网络访问,插入拦截逻辑Interface(接口层)接收用户的网络访...原创 2019-09-21 11:48:25 · 213 阅读 · 0 评论 -
OkHttp之缓存配置
当客户端和服务端不能达成一致的协议,不能要求服务端按照客户端的意愿进行开发缓存之拦截器 class CacheInterceptor implements Interceptor{ @Override public Response intercept(Chain chain) throws IOException { // 每个...原创 2019-09-21 11:47:51 · 239 阅读 · 0 评论 -
OkHttp的基本使用
OKhttp的post请求和get请求提交键值对 //1.创建OkHttpClient对象 OkHttpClient okHttpClient = new OkHttpClient(); //2.通过new FormBody()调用build方法,创建一个RequestBody,可以用add添加键值对 RequestBody...原创 2019-09-21 11:46:24 · 399 阅读 · 0 评论 -
理解Window和WindowManager(一)
Window和WindowManagerWindow是一个抽象类,具体实现是PhoneWindow。Window的具体实现位于WindowManagerService中。所有的视图都是通过Window来呈现的,Window实际是View的直接管理者。创建Window通过WindowManager完成,WindowManager是外界访问Window的入口,WindowManager和Windo...原创 2019-08-11 18:11:58 · 242 阅读 · 0 评论 -
Android动画(一)--视图动画
视图动画View动画一个非常大的缺陷突显,其不具有交互性。当某个元素发生View动画后,其响应事件的位置依然在动画进行前的地方,所以View动画只能做普通的动画效果,要避免涉及交互操作。透明度变化(AlphaAnimation)位移(TranslateAnimation)缩放(ScaleAnimation)旋转(RotateAnimation)这4个动画类都继承自 Animati...原创 2019-05-27 23:30:32 · 187 阅读 · 0 评论 -
Android动画(二)--属性动画
Android动画(二)–属性动画属性动画借助于插值器(Interpolator)和估值器(TypeEvaluator),按照一定变化率对属性值进行操作的机制,变化率就是依赖Interpolator控制,而值操作则是TypeEvaluator控制。与视图动画的区别:属性动画作用的对象可以是任何一个Object对象,也就是说我们完全可以给任意Object对象设置属性动画,而这个对象可以不是...原创 2019-05-27 23:33:31 · 173 阅读 · 0 评论 -
RecyclerView的简单使用
android动画属性动画视图动画原创 2019-05-28 20:10:45 · 228 阅读 · 0 评论 -
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 · 154 阅读 · 0 评论 -
Android IPC机制(一)IPC基础概念
IPC简介IPC的含义为进程间通信或者跨进程通信,是指两个进程之间进行数据交换的过程多进程的情况分为两种:1. 一个应用因为某些原因自身需要采用多进程模式来实现2. 当前应用需要向其他应用获取数据Android中的多进程模式开启多进程模式正常情况下,在Android中多进程是指一个应用中存在多个进程的情况。在Android中使用多进程的方法:给四大组件在AndroidM...原创 2019-06-08 12:28:49 · 389 阅读 · 0 评论 -
Android IPC机制(二)Binder的工作机制
Binder的理解Binder是Android中的一个类,它实现了IBinder接口。从各个角度来说明Binder:IPCAndroid FrameworkAndroid应用层是Android中的一种跨进程通信方式;还可以理解为一种虚拟的物理设备,该方式在Linux中没有是ServiceManager连接各种Manager和相应ManagerService的桥梁是客...原创 2019-06-09 16:15:27 · 525 阅读 · 0 评论 -
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 · 1844 阅读 · 0 评论 -
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 · 123 阅读 · 0 评论 -
View工作原理--ViewRootImpl和performTraversals()
ViewRootImplViewRoot(android 2.2之前的老版本)对应于ViewRootImpl(替代ViewRoot)类,它是连接WindowManager和DecorView的纽带,View的三大流程均是通过ViewRoot完成的。当Activity对象被创建完毕后,会将DecorView添加到Window中,同时会创建ViewRootImpl对象,并将ViewRootImpl对...原创 2019-08-02 16:28:45 · 2850 阅读 · 0 评论 -
View的事件分发机制(一)--ViewGroup的dispatchTouchEvent源码分析
解析Activity的构成当一个点击事件产生后,事件最先传递给Activity。写Activity时会调用setContentView()方法来加载布局setContentView()方法的实现调用了getWindow().setContentView(layoutResID)getWindow()得到的是一个PhoneWindow(PhoneWindow是继承抽象类Window的)从P...原创 2019-07-25 20:44:06 · 382 阅读 · 0 评论 -
View工作原理--MeasureSpec
MeasureSpec参与了View的measure过程,它在很大程度上决定了View的尺寸规格。(因为父容器影响View的MeasureSpec的创建过程)在测量过程中,系统会将View的LayoutParams根据父容器所施加的规则转换成对应的MeasureSpec,根据这个MeasureSpec测量出View的宽/高(不一定等于最终宽高)注意:MeasureSpec不是唯一由Layou...原创 2019-08-03 11:57:06 · 281 阅读 · 0 评论 -
Android自定义视频播放器(一)--SurfaceView
双缓冲机制CPU访问内存的速度要远远快于访问屏幕的速度每次都一个个从内存中读取图形然后绘制到屏幕就会造成多次地访问屏幕第一层缓冲先在内存中将所有的图像都绘制到一个Bitmap对象上,然后一次性将内存中的Bitmap绘制到屏幕 @Override protected void onDraw(Canvas canvas) { canvas.drawRect(...原创 2019-07-31 16:51:31 · 508 阅读 · 0 评论 -
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 · 146 阅读 · 0 评论 -
View的工作流程--draw过程
调用流程performTraversals()里在调用完layout流程后也调用了performDraw()ViewRootImpl # performDraw() private void performDraw() { if (mAttachInfo.mDisplayState == Display.STATE_OFF && !mReportNext...原创 2019-08-08 17:19:08 · 370 阅读 · 0 评论 -
理解Window和WindowManager(二)--Window的内部机制
Window是一个抽象的概念,每一个Window都对应着一个View和一个ViewRootImplWindow和View通过ViewRootImpl来建立联系,Window是以View的形式存在。Window的添加过程Window的添加过程需要通过WindowManager的addView来实现,WindowManager是一个接口,它的实现类是WindowManagerImplWindow...原创 2019-08-13 14:39:54 · 215 阅读 · 0 评论 -
View的工作流程--layout过程
调用流程layout流程是从performTraversals()开始的,performTraversals()在调用完测量流程后,又调用了performLayout(),这是layout流程的起点。ViewRootImpl # performLayout() private void performLayout(WindowManager.LayoutParams lp, int d...原创 2019-08-06 20:12:24 · 142 阅读 · 0 评论 -
Android小项目--简易计算器
Android:简易计算器前言:最近刚开始学习Android,看了一下基本控件和四种布局就开始动手写这个计算器,注明一下啊,它只能算带括号的简单运算,emmm复杂的算不了。这算是自己的第一个APP,如果还有哪些Bug和不完善的地方欢迎大家指出来。让我们来看一下简易计算器的具体实现过程(注意啊,开发环境是Android Studio):在准备写计算器前应该先在Android Studio里面...原创 2018-08-04 10:58:16 · 4988 阅读 · 4 评论