自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(76)
  • 收藏
  • 关注

原创 Binder原理学习记录

本文主要对Binder的理解以及对Binder原理进行一个解析。

2022-01-22 22:32:46 3707 2

原创 APP的启动流程梳理

前言2022年的第一篇分享文章,整整一周,利用晚上下班时间梳理了桌面点击APP到打开的流程,可以说看似简简单单的一个操作,里边的过程相当复杂,各种进程间通信等等,下面我们一起看看整个流程是怎么样的。正文我们先通过一张图来看整个流程的一个概览:startActivity桌面点击app到打开,涉及了三个进程,分别如下:Launcher进程:它是一个Activity,可以把桌面看成是一个app,里边有多个啊、其他app的入口,当点击app图标时,就会去启动对应的app,并且跳转至页面。System

2022-01-08 22:57:43 3401 2

原创 Flutter渲染原理学习

开始​写Flutter已有好几个月的时间了,最开始总会有一点点不适应,但是写一段时间后还是觉得蛮顺手的,而且支持热更,不需要等整个项目编译,提升了不少效率。但是在开发过程中,总是会遇到因为Widget嵌套得不好而出现一些错误,于是一直想学习一下它的相关原理看看是为什么。所以通过学习和参考网上大神分享的的一些资料,整理出了今天要分享的文章。正文Flutter有三棵重要的树,分别是Widget树、Element树、RenderObject树,它们各司其职,分成了几个相关联但清晰的结构。Widget树与我们

2020-09-05 21:09:52 989 1

原创 ARouter原理学习记录

前言春节后的第一篇分享,工作状态也慢慢找回来。本文将给大家带来的分享是ARouter的的原理介绍,通过了解它的原理,我们可以知道它是如何支持组件化和不互相依赖的模块间进行调用或者页面的跳转。正文ARouter介绍ARouter是阿里开源的一个用于进行组件化的路由框架,它可以帮助互不依赖的组件间进行页面跳转和服务调用。ARouter使用添加依赖:android { //... defaultConfig { kapt { arguments {

2022-02-14 23:55:22 1519

原创 什么是元宇宙?

现在元宇宙这个概念越来越热门,网上也各有各的理解。那么到底什么是元宇宙呢?大家评论区说说各自的看法,一起讨论。

2021-11-27 00:35:51 269

原创 线程池使用及原理(看完就懂)

前言平时我们开发中,总离不开与线程打交道,经常会开启线程去做一些耗时任务,使用线程,便需要去对线程进行管理,下面我们一起来看看线程的创建和使用线程池对线程的管理。正文1. 线程的创建首先我们来看看线程的创建方式:a.直接继承Thread类:class MyThread extends Thread { @Override public void run() { super.run(); System.out.println("thread run.

2021-10-16 23:07:39 276

原创 Synchronized的使用及原理(这篇文章就够了)

前言平时的开发中,我们经常与多线程接触,有时候某个变量是可以多个线程共享的,那么很有可能就会引入同步问题,使用synchronized关键字,将存在同步问题的代码块或者方法修饰起来,便是我们经常用来解决多线程同步的问题,下面我们一起看看它的使用及原理。正文1.同步问题:private static void test() { Runnable task = new Runnable() { int count = 10; @Override p

2021-09-25 11:13:17 284

原创 Handler原理学习

前言Handler可以说是老生常谈了,因为它在整个Android的系统中是非常重要的一部分,学习它的原理是很有必要的。本文带来的分享是对Handler原理的全面解析,相信对日常的开发和面试会有很大的帮助,下面我们一起看看它的原理。正文在讲解Handler原理之前,我们先通过一张图片看看它的整个流程:当然,我们接下来所讲的Handler原理,不仅仅是Handler本身,还包括MessageQueue、Looper等类。Handler的作用在日常开发中,我们很多时候需要切换线程去做某件事情,比如在

2021-09-20 22:52:50 301 1

原创 屏幕刷新机制与Choreographer的工作原理

前言2021的进度已过50%,不知大家的小目标是否已经也到达了50%了,如果没有的话,还有2021的下一个50%。本文将给大家带来Android的屏幕刷新机制的介绍,同时通过Choreographer的源码了解它的工作原理。正文刷新率:代表一秒内屏幕刷新的次数,大部分手机的刷新率为60Hz,即一秒刷新60次,所以大概就是16.6ms刷新一次,这个是由硬件的参数决定的。帧率:相信开发客户端的同学都听说过FPS,也就是帧率。帧率代表一秒内绘制的帧数,当某个页面或者某个操作的帧率比较低时,也就是出现丢帧的

2021-07-03 12:15:34 485 1

原创 EpoxyRecyclerView的简单使用与源码分析

前言EpoxyRecyclerView很好地支持列表中有多种布局类型,让我们在使用的过程无需去关注ViewType,而是直接为每个类型定义对应的Model就可以了。它会自动为我们做了差分,还提高了的性能。EpoxyRecyclerView的Github地址:https://github.com/airbnb/epoxyEpoxyRecyclerView的使用添加依赖:在app的bu...

2019-10-12 18:50:27 1576

原创 探索组件化框架CC原理

前言CC采用组件总线的方案,可以让你在对老项目进行组件化时不需要一下子拆分成一个个组件,反而这是一个渐进的过程,也就是文档所说的渐进式组件化。既然它这么优秀,那我们在使用它时,学下它的原理应该会有很多的收获。CC的项目地址:https://github.com/luckybilly/CCCC的文档地址:https://qibilly.com/CC-website文中的图片出自它的文档地址。...

2019-08-10 09:52:40 782 2

原创 组件化之路

前言从之前就一直听说对应用进行组件化,很是火热,也出现了很多组件化方案的开源库。于是查阅了很多的学习资料,看了几个开源的组件化实战例子与组件化方案的开源库,总结后尝试去对之前做过的一个项目进行组件化,也是对学习到的进行实践与检验。在实践的过程中很感谢板神对我的指导。开始什么是组件化?组件:可以想象成一辆车,车由车轮、发动机、方向盘等组成,这些物件可以认为是组件。组件化是指解耦复杂系...

2019-07-07 15:12:24 783

原创 EventBus源码学习

前言之前使用EventBus不多,所以也没有比较好的去学习它,后来使用得比较频繁,而且感觉很好用,所以对它的使用进一步学习外,最近还对它的实现进行学习。EventBus的创建EventBus采用单例和Builder模式对本身进行创建:public static EventBus getDefault() { if (defaultInstance == null) { ...

2019-04-19 19:24:57 209

原创 使用Flutter编写应用(五)

前言如果你从第一篇连读到本文,可能你已经把天气app的简易版写出来了,但是数据的缓存或者列表的美观度还是远远不够。本文将对城市列表进行改动并且对获取到的网络数据通过文件缓存起来,在拿不到网络数据的时候使用。1.修改成宫格将CityWidget中的build方法返回改成宫格的Widget @override Widget build(BuildContext context) { ...

2019-03-19 13:45:21 274

原创 使用Flutter编写应用(四)

前言前面分享了天气详情页与城市列表页,但是它们目前还是相对独立的,也就是没有任何的数据传递与之间的切换。本文将分享如何将它们连接起来,实现页面间的跳转与数据传递。开始1.页面跳转a.定义路由名字在MaterialApp中定义routes:routes: { "weather": (BuildContext context) => WeatherWidget(), "cit...

2019-03-08 18:08:15 254

原创 使用Flutter编写应用(三)

前言前两篇实现了从实时天气的界面,这次将分享获取城市列表的数据并展示出来。获取数据和刷新的流程跟天气获取展示是一样的,不一样的是通过本文可以认识新的组件ListView。开始1.创建城市Widgetclass CityWidget extends StatefulWidget { @override State<StatefulWidget> createState(...

2019-03-07 18:49:05 288

原创 使用Flutter编写应用(二)

前言上一篇分享了如何搭建界面,但是没涉及到数据的获取与操作。本文将分享如何异步从网络获取数据并显示出来。开始1.引入网络请求包和json转换包:import 'dart:convert';import 'dart:io';2.创建数据实体类:class WeatherData { WeatherData({this.city, this.tmp, this.txt}); ...

2019-03-06 17:29:31 248

原创 使用Flutter编写应用(一)

前言搭建好Flutter的开发环境后,便可以开始应用的编写,关于环境如何搭建上篇文章已有分享。现在进入使用Flutter来编写一个小应用,由于自己没时间去搭建服务端和写接口,所以直接去申请天气预报接口,然后开始了应用的实现。开始本文分享的是构建天气详情页,展示的数据暂时写死,后面会通过网络接口换上。该页面准备展示城市,温度和天气情况,在最下面还展示一条心情便签。创建并初始化创建工程,然后...

2019-03-01 19:11:00 521

原创 入门Flutter——初体验

前言Flutter是谷歌的移动UI框架,可以快速在iOS和Android上构建高质量的原生应用界面,它是开源的。使用Dart作为开发语言,如果有Java编程经验,Dart语言很好上手。最开始接触的时候,对于它的编码有点抗拒(虽然现在还有点,应该是不熟悉的原因吧),但不用具备移动开发经验的人也可以进行学习与使用。Flutter可加入到现有的Android或者IOS项目中,它还具备热加载。开始1...

2019-02-28 18:09:32 565

原创 Activity将View添加到Window的过程

前言在开发的时候,我们经常会因为跳转到另外的界面而去启动Activity,然后被启动的Activity就会呈现在屏幕上。实际启动的过程很复杂,涉及IPC、Window 的添加等等。本文章将分享Activity的View被添加到Window的过程。正文在Activity的启动过程中,会调用ActivityThread还会调用handleLaunchActivity去开始Activity的生命周...

2019-02-27 10:14:30 410

原创 OkHttp源码学习(二)拦截器

前言OkHttp同步或者异步都会通过getResponseWithInterceptorChain方法获取响应,此方法通过一系列的拦截器进行处理。这些拦截器分别有:RetryAndFollowUpInterceptor(重试或者重连)、BridgeInterceptor(request和response的转换)、 CacheInterceptor(缓存)、ConnectIntercepto...

2018-11-30 20:39:55 196

原创 RecyclerView的复用与回收机制

前言最近学习了RecyclerView的进阶使用,同时也学习了它的缓存机制,以下是通过看它相应的源码去了解它的获取View(ViewHolder)缓存的过程。寻找获取缓存起点获取缓存的起点为绘制流程的onLayout方法,然后追寻相关方法:dispatchLayout()—>dispatchLayoutStep1()—>mLayout.onLayoutChildren(mRe...

2018-11-10 20:02:49 1643

原创 RecyclerView的进阶使用(分割线、拖拽、动画)

前言使用RecyclerView已经很久了,它相对于ListView和GridView方便很多,使用LayoutManager等类可以给它的使用带来很大的便利。但是后面发现,使用RecyclerView的功能只是那么一小点,也就是都它的基本使用,所以最近对它进一步学习和使用。添加分割线RecyclerView默认是没有为我们添加分割线的,这得需要通过自己去实现,虽然看起来麻烦,但是反过来...

2018-11-08 21:41:42 495

原创 重温RxJava(使用Kotlin编写)

前言 使用RxJava挺久的了,但是这后面接触的少,所以有一些淡忘了,于是今天再一次总结了一下,刚好最近都在用Kotlin,所以以下代码是使用Kotlin编写的。RxJava可以说是这样的:异步:可以很方便地切换线程简洁:在复杂的逻辑中保持代码简洁基本使用1.创建一个ObserveronNext:观察数据onError:事件队列失败调用的方法onCom...

2018-09-15 23:41:06 2943

原创 Retrofit源码学习

前言 学习Retrofit的源码已经有一段时间了,最近又翻了一遍,然后总结了一下。它里面用到了很多个设计模式,有工厂模式、代理模式、适配器模式等。Create方法mRetorfit.create(Service.clss)create方法的返回语句如下: return (T) Proxy.newProxyInstance(service.getClassLoad...

2018-09-05 23:55:27 222

原创 从生成代码来学习Dagger2的注入过程

前言 用过的同学都会知道,Dagger2用于去除依赖,通过注解便可以为我们生成创建对象的代码。通过apt插件在编译阶段生成注入代码,反射只在编译阶段使用,在应用运行阶段没有涉及到注解反射。下面直接进入生成代码的分析,这也是我最近对生成代码学习的记录。当我们使用Dagger编写好代码后,build一下,只要依赖关系没问题,那么就可以在app/build/generated/source...

2018-09-04 20:56:47 267

原创 OpenGL ES 2.0学习(一)入门知识点

前言 一个多月前开始学习Android OpenGL ES,起初是因为需要做滤镜,然后慢慢发现很有趣。但是自己感觉学起来并没有想象那么容易,主要涉及太多的转换,还有着色器语言等,但它确实强大,可以做一些滤镜,很炫的3D效果/全景等。目前自己还处于入门阶段。OpenGL ESOpenGL ES 为OpenGL嵌入式系统,是一个适用于嵌入式系统的二维或者三维的图形库是桌面版O...

2018-08-30 21:04:01 746

原创 自定义一个很舒服的视频录制按钮

前言 最近开发了相机的相关功能,其中包括了视频的录制。当做好录制功能时,学长就要求要把录制的按钮改成比较友好和美观,过后按照了提出的效果自定义了这个录制按钮。今天分享给大家。...

2018-07-21 01:09:57 1195

原创 Architecture Component—Paging 的使用及源码阅读

Paging Libray简单来说,Paging Libary用于数据的加载,然后显示到UI上。它是很有趣并且很方便于我们的一个库,比如在后台线程加载好数据,然后在主线程中将数据展示出来。实现了数据的加载处理与UI分离开,并且可以在用户不知不觉中加载更多的数据,使之能够无限的加载更多,不用待到以后滑到底采取加载更多。当然,它的功能不止上述。Paging Libray的相关类Da...

2018-07-03 21:33:39 989

原创 Java基本类型与包装类型

前言 从开始接触Java到现在也有两年的时间了,还记得最开始就是学数据类型,这是最基础的,可能大家会觉得这有什么好讲的,但是很多时候我们在开发中可能会忽略关于它们的一些知识点,这篇文章将给大家带来关于Java基本类与String的一些知识。基本类型以下通过一个表格来说明它们: 类型 字节数 取值范围 byte 1 -2^7 ~ 2^7 - 1...

2018-05-13 21:22:55 274

原创 OkHttp使用与源码学习(一)

前言 从开始使用OkHttp已经很久了,它是一个很nice的网络框架,其功能强大,可进行失败重连,在连接中出问题时自动恢复。最近在复习的时候学了它的源码,以下主要是写它的使用和源码学习。使用GET请求//异步请求OkHttpClient client=new OkHttpClient();Request request=new Request.Builder()...

2018-05-03 22:25:51 337 1

原创 设计模式之观察者模式

概述 日常生活中,我们在某个应用中订阅某一主题的信息,那么该应用会向我们推送我们所订阅类型的相关信息;或者说我们定了X类型的报纸,那么送报员每天会给我们送来X类型的报纸,让我们能够得知该类型的最新动态。以上的两种场景,就是观察者模式的表现。我们就像是观察者,而我们订阅的主题就像是被观察者,只要他们有最新的消息(更新)就会来通知我们,使我们可得知最新的动态,方便我们作出一系列的操作等。...

2018-04-29 22:39:06 184

原创 设计模式之工厂模式

概述 一说到工厂,我们都知道它是生产某产品的场所,里边有工人、设备、技术人员等。经过一番的辛勤劳作,便会产出相应的产品。而工厂模式,顾名思义它是一种像工厂的模式,把某个对象的生产过程封装在工厂类中,根据用户的不同需求生产出不同的产品。工厂模式例子//动物的最上层public interface Animal { void move();//移动}//猫类...

2018-04-22 17:54:04 212

原创 设计模式之Builder模式

概述 在平时开发或者开别人源码的时候,都会看到很多的Builder,它把构建的细节完全隐蔽起来,在用户不知道构建细节的情况下把一个对象创建了出来,就很像建房子一样,我们只需要提供材料、工钱和设计图,建设过程全部交由建设工程师做,你完全可以不用知道怎么做,最后一个跟设计图一样的房子就会出现在面前(当然需要时间)。Builder模式例子//房子构建类public class H...

2018-04-16 23:13:45 239

原创 设计模式之策略模式

概述 在平时出门的时候,可能我们会为了选择穿什么鞋子而犹豫,因为出门的目的不同,所以就会选择不同的鞋子,而穿上不同的鞋子出门。今天为大家带来的设计模式是策略模式,它与上述的情景很类似,比如在图片缓存策略中,我们可以根据需要(本地缓存或本地缓存+内存缓存)而传入不同的缓存类。策略模式的定义为:有一系列的算法,将每个算法封装起来,各个算法可以替换。可能定义有点抽象,以下为具体的代码实现简单的策...

2018-04-08 13:23:50 175

原创 设计模式之代理模式

概述 在生活中,我们可能会遇到这样的场景:我们想购买一些进口的商品,但是自己没有护照或通行证,这时候我们想到的就是代购,而代购的这个人也就是代理人,ta不是实际销售商品的人,只是起到代购的作用,在这中途ta可以赚点差价作路费(中途操作)。下边介绍的就是与这个场景很相似的设计模式——代理模式代理模式代理模式分为两种,一种是静态代理,另一种是动态代理。静态代理:代码实...

2018-04-05 23:15:18 171

原创 基于RecyclerView实现侧滑删除

列表的条目侧滑删除可以说是最熟悉不过的了,它的实现方法也有很多,这次我给大家带来的是基于RecyclerView实现的。关于RecyclerView的使用在本文中没有提及,可以看看这篇:RecyclerView的使用先看看效果图: 大概思路为:重写RecyclerView的onTochEvent方法点击时,获取点击的位置,根据位置(坐标)去获取点击的条目对应的View,顺...

2018-03-02 22:19:53 1040

原创 ThreadLocal的使用和实现原理

概述 ThreadLocal是一个将指定值储存到指定线程的类。简单的讲ThreadLocal可以指定储存数据类型,然后在不同线程中设置某个值,这个值在其他线程是不可以获取到的,只能在本线程才能获取到。平常中很少使用到ThreadLocal,但在也不少见到,比如Looper类中就有使用到它。使用ThreadLocal的使用不难,就是先创建ThreadLocal对象并指定要存储的...

2018-03-01 14:32:28 535

原创 集合框架源码学习之HashTable

前面学习的集合都是非线程安全的,这次学习的集合它的方法都加了同步,使得它是线程安全的。简介基于hash表实现,存放key-value对,通过单链表解决hash冲突当容量超过闸值时,会进行扩容实现Serializable、Cloneable接口,支持克隆和序列化线程安全,可用于多线程中源码构造方法//存放单链表,用于解决冲突,每个HashtableEntry实际...

2018-02-10 23:46:33 230

原创 集合框架源码学习之HashMap

简介基于哈希表,每一个元素都是key-value对,内部通过单链表解决冲突有闸值,当元素个数大于闸值时会自动扩容(为原来的2倍)非线程安全实现了Serializable、Cloneable,支持序列化和克隆源码构造方法public class HashMap<K, V> extends AbstractMap<K, V> implements Ma...

2018-02-10 00:19:06 269

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除