RxJava作为主流的框架之一,有着丰富的功能操作符以及便捷的线程切换,深受Android开发者喜爱,本文尝试从源码角度分析其工作原理。 Single.just Single.just最为最简单的模型,可以看下它是如何工作的: Single<Integer> single = Single.just(1); single.subscribe(new SingleObserv...
Android三方开源库之OkHttp源码分析
OkHttp 是目前应用最广泛的开源网络库了,而且在Android6.0之后也将内部的HttpUrlConnection替换成了OkHttp,这篇文章来分析一下源码。 基本使用 OkHttpClient client = new OkHttpClient(); Request request = new Request.Builder() .url("https://github...
Android三方开源库之Retrofit源码分析
Retrofit是目前Android开发中主流的网络请求客户端,其底层基于OkHttp封装,提供了方便高效的网络请求框架。 基本用法 Retrofit retrofit = new Retrofit.Builder() .baseUrl("https://api.github.com") .addConverterFacto...
Android三方开源库之LeakCanary2.4源码分析
LeanCanary内部主要使用了Reference以及ReferenceQueue配合来实现对象被回收时的监听,这是它的核心逻辑,因此我们先了解下这部分内容: Reference Reference是一个泛型抽象类,其中软引用、弱引用、虚引用都继承自它,它主要有几个成员变量: 泛型引用对象 T:被回收时被赋值为null 引用队列 ReferenceQueue:一个单链表实现...
Android三方开源库之BlockCanary源码分析
我们手机屏幕帧率通常是60,也就意味着每秒钟有60个画面出现,即16.6ms就要有一个画面渲染出来,Android系统每隔16.6ms发出一个Vsync信号,触发对View进行渲染,如果在这个时间内渲染成功,那么画面正常显示,否则就会出现丢帧的情况,如果掉帧频率很高,也就导致了卡顿。 我们回顾一下View刷新机制,App启动时,会通过ActivityThread类的main方法,创建一个主...
Android Framework之Binder原理分析
Binder是Android Framework层一个不可或缺的存在,了解Framework的前提必须先掌握Binder原理,它是Android进程间通信的一种方式,我们在应用程序使用的四大组件,可以运行在同一个进程,也可以运行在不同进程,进程之间通信就依赖Binder,另外我们之前了解到的系统服务,像AMS、PMS、WMS等都是基于Binder IPC 进行通信的。 进程空间 Linu...
Android Framework源码分析之屏幕刷新机制以及Choreographer
生活中,我们经常遇到别人说手机画面卡,这里的卡对应我们开发者来说,表示的就是掉帧(jank)或者画面撕裂(tearing),我们先来说说一些概念: 帧(Frame):动画中的单幅画面,相当于电影胶片中的一个镜头,一帧就是一幅静止的画面,连续帧动起来就是我们看到的动画。 帧率(Frame Rate):每秒传输的图片画面的帧数,也可以理解为画面每秒钟刷新几次...
Android Framework源码分析之View的绘制流程
通过分析Activity的启动过程,我们知道,View的绘制开始是从ViewRootImpl类中通过调用setView方法执行了requestLayout后开始的。 requestLayout过程 // ViewRootImpl.java public void setView(View view, WindowManager.LayoutParams attrs, View panel...
Android Framework源码分析之Activity、Window、View之间的关系
每当我们显示一个界面的时候,都是通过start一个Activity的方式,对于显示布局内容,也只是通过在onCreate方法里面setContentView就可以,剩下的都是Activity帮我们做了,我们自始至终也没有创建过window或者view,那么这背后都发生了什么 ?这篇文章梳理一下这三者的关系 setContentView 我们从setContentView源码开始: //...
Android Framework源码分析-Activity的启动过程
Activity是我们平时用到最多的一个组件之一,它提供给用户一个可以交互的页面,通常启动一个Activity可以使用下面代码: Intent intent = new Intent(this, DemoActivity.class); this.startActivity(intent); 可以看出代码很简洁,但是背后有着复杂的执行流程,这篇文章就介绍下Activity启动的执行过程...