自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

李林杰的博客

写出来,是让自己理解的更加深刻!

  • 博客(40)
  • 资源 (1)
  • 收藏
  • 关注

原创 解读Android中View的事件分发机制

事件分发的顺序Activity->Window->DecorView->ViewGroup->View事件的类型ACTION_DOWN、ACTION_MOVE、ACTION_UP、ACTION_CANCEL通常一个事件序列是这样的ACTION_DOWN 事件是一个事件的起点,然后伴随着多个ACTION_DOWN事件,然后是ACTION_DOWN,中间可能会收到一个ACTION_DOWN事件Activity的事件分发// Activity的dispatchTouchEven

2021-10-12 17:45:55 41

原创 Jetpack系列之ViewModel

省略相关背景介绍,直接进入主题。ViewModel 它是一个对Activity/Fragment 组件进行数据管理的。可以理解为一个数据管家,那么日常的业务逻辑数据交互都可以在里面实现,也可以比喻为我们所知道的Presenter、或者Controller,不过它更强大,因为它是Google实现的,并且是响应式的,换句话说,Activty/Fragment销毁了,他不一定销毁,比我们的Activity是非正常销毁,或者重建了,那么这个ViewModel仍然活着,Activity重建之后可以继续使用。但是如果

2021-03-07 22:18:11 161

原创 Jetpack系列之LiveData

省略相关背景介绍,直接进入主题,LiveData看名字就可以知道,这是一个可以感知生命周期的数据模型。那么前面分析到如何感知Activity/Fragment的生命周期呢?本质还是要注册一个观察者给Activity。所以LiveData既然可以感知,那么想必内部也是注册了一个观察者给Activity,果不其然,分析源码可知,其有一个内部类LifecycleBoundObserver,class LifecycleBoundObserver extends ObserverWrapper implement

2021-03-07 22:17:43 31

原创 Jetpack系列之Lifecycle

这里省略了Lifecycle的相关背景介绍,直接进入主题。我们这里先不深入到源码分析,就从常用的几个类分析下这个组件的实现思路。一句话,这个Lifecycle设计思想就是一个观察者模式。其观察者模式相关的核心类被观察者 LifecycleOwner观察者 LifecycleObserver存储观察者的容器 LifecycleRegistry这是一个典型的观察者需要具备的元素那么Android中Activity如何利用这些组件发送自己的生命周期事件呢?Android support 包 2

2021-03-07 22:17:11 37

原创 Android高效加载大图

本文翻译自google官方开发文档高效加载大型位图高效加载大型位图注意:有几个库遵循了加载图片的最佳做法。您可以在应用中使用这些库,从而以最优化的方式加载图片。我们建议您使用 Glide库,该库会尽可能快速、顺畅地加载和显示图片。其他常用的图片加载库包括 Square 的 Picasso、Instacart 的 Coil 和Facebook 的 Fresco。这些库简化了与位图和 Android 上的其他图片类型相关的大多数复杂任务。图片有各种形状和大小。在很多情况下,它们的大小超过了典型应用

2021-02-27 14:00:24 134 1

原创 Android性能优化典范-管理应用内存

本文翻译自google官方开发文档管理应用内存管理应用内存随机存取存储器 (RAM) 在任何软件开发环境中都是一项宝贵资源,但在移动操作系统中,由于物理内存通常都有限,因此 RAM 就更宝贵了。虽然 Android 运行时 (ART) 和 Dalvik 虚拟机都执行例行的垃圾回收任务,但这并不意味着您可以忽略应用分配和释放内存的位置和时间。您仍然需要避免引入内存泄漏问题(通常因在静态成员变量中保留对象引用而引起),并在适当时间(如生命周期回调所定义)释放所有 Reference 对象。本页面介绍了如何

2021-02-25 10:40:28 55

原创 Android编码架构MVx演进历史

架构模式的理解架构为了解决特定的问题而提出,按照特定的原则将系统整体进行模块/组件/角色的划分,建立模块/组件/角色间的沟通机制。具体解释一下,首先是要有特定的问题,没有问题空谈架构,仿佛是空中楼阁,没有实用价值,而对应到不同的问题,会有不同的解决方式。其次是模块的划分要根据特定的原则,没有原则随意划分,也就无从去评估一个架构的好坏。最后就是模块间的通信机制,让系统成为一个整体。最后,架构模式,其实更多的是一种思想,一种规则,往往一种架构模式可能会有不同的实现方式,而实现方式之间,只有合适与否,并没

2021-02-23 17:24:02 84 2

原创 Android应用内存优化典范——高性能编码优化

本文翻译自google官方开发文档性能提示本文档主要介绍了各种微优化,如果将其配合使用,能够提高应用的整体性能;但是,这些更改不太可能对性能产生显著影响。选择正确的算法和数据结构应始终是您的首要任务,但此内容不在本文档的讨论范围内。您应该将本文档中的提示作为编码时的一般做法并养成习惯,从而提高综合代码效率。编写高效代码有两个基本规则:不需要做的工作就不要做。如果可以避免,就不要分配内存。在微优化 Android 应用时,您会遇到的最棘手的问题之一是应用肯定会在多种类型的硬件上运行。不同版本的虚

2021-01-14 15:53:26 38

原创 Android应用启动优化

应用启动时间用户希望应用能够及时响应并快速加载。启动时间过长的应用不能满足这个期望,并且可能会令用户失望。这种糟糕的体验可能会导致用户在 Play 商店针对您的应用给出很低的评分,甚至完全弃用您的应用。本文档提供的信息可以帮助您优化应用的启动时间。首先介绍启动过程的内部机制。然后,讨论如何剖析启动性能。最后,介绍一些常见的启动时间问题,并给出一些有关如何解决这些问题的提示。了解应用启动内部机制应用有三种启动状态,每种状态都会影响应用向用户显示所需的时间:冷启动、温启动或热启动。在冷启动中,应用从头开

2021-01-11 11:10:24 289 3

原创 Android Binder通信机制

Android为什么采用Binder作为IPC机制?Android系统内核基于Linux内核,Linux现有的进程通信方式如下:管道:在创建时分配一个page大小的内存,缓存区大小比较有限;消息队列:信息复制两次,额外的CPU消耗;不合适频繁或信息量大的通信;共享内存:无须复制,共享缓冲区直接付附加到进程虚拟地址空间,速度快;但进程间的同步问题操作系统无法实现,必须各进程利用同步工具解决;套接字:作为更通用的接口,传输效率低,主要用于不通机器或跨网络的通信;信号量:常作为一种锁机制,防止某进程

2020-12-29 10:48:33 57

原创 Java线程池的灵魂拷问,这些你都会吗?

问题1:为什么要使用线程池?传统的创建线程方式 new Thread(new Runnable(){}).start(); 殊不知这种创建线程有以下缺点:如果频繁创建和销毁线程会带来性能损耗,线程的创建和销毁都需要时间,如果创建和销毁的时间大于任务执行时间,反而得不偿失。线程需要占用内存空间,大量的线程会抢占宝贵的内存资源,会导致oom,大量的线程也会给gc很大压力,延长gc的停顿时间。大量的线程会抢占cpu资源,cpu在不停的做上下文切换,反而没有时间去处理线程运行的时候该处理的任务。问题2

2020-12-17 11:10:58 68

原创 你真的会用Handler?

前言Handler消息机制是Android中提供的一种线程间通信机制,说到线程间通信,懂Java的我们都知道可以通过等待唤醒机制(wait/notify)实现线程间通信,但是这种机制会产生锁的竞争、线程的阻塞。响应不是很快,所以google的大佬们自己开发出一套线程间通信机制-Handler消息机制。Handler消息机制符合生产者消费者模型,有以下几个角色组成。Looper、MessageQueue、Message、HandlerHandler整体工作流程简要概述下Handler消息机制的整体运作

2020-10-30 13:52:42 116

原创 Retrofit2源码解析

前言上一篇文章中讲解了Retrofit的基本使用,分为如下几个步骤:Step1 定义接口层public interface GitHubService { @GET("users/{user}/repos") Call<List<Repo>> listRepos(@Path("user") String user);}Step2 通过Retrofit创建接口层的一个代理对象Retrofit retrofit = new Retrofit.Builder(

2020-09-21 09:50:58 38

原创 Retrofit2基本使用

概述Retrofit是当下最热门的Android网络请求库,准确的来说Retrofit是一个RESTful的HTTP网络请求框架的封装,因为它内部网络请求的工作,本质上是通过OkHttp完成,而Retrofit仅负责网络请求接口的封装。具体是客户端通过Retrofit请求网络,实际上是通过Retrofit的接口层封装了请求参数,header,url等信息,之后由OkHttp完成后续的请求工作。然后在服务端返回数据之后,OkHttp将原始的结果传递给Retrofit,Retrofit根据客户端的相关配置,将

2020-09-13 21:55:41 3516

原创 OkHttp3源码分析

OKHTTP介绍在前一篇文章中已经初步介绍了OKHTTP框架以及基本的使用,不熟悉的读者可以看我的上一篇文章OKHTTP基本使用,下面从OKHTTP的源码出发,分析整个请求的过程。笔者这里分析的OKHTTP版本是3.8.0官方请求案例OkHttpClient client = new OkHttpClient();String run(String url) throws IOException { Request request = new Request.Builder() .

2020-09-08 14:08:54 333 1

翻译 OkHttp3基本使用

OKHTTP概述HTTP是现代应用程序网络的方式。这就是我们交换数据和媒体的方式。有效地执行HTTP可使您的内容加载更快并节省带宽。OkHttp是默认情况下是有效的HTTP客户端:HTTP/2支持允许对同一主机的所有请求共享一个套接字连接池可减少请求延迟(如果HTTP/2不可用)透明的GZIP缩小了下载大小响应缓存可以完全避免网络重复请求当网络出现问题时,OkHttp会持续运行,它会从常见的连接问题中静默地恢复。如果您的服务有多个IP地址,如果第一次连接失败,OkHttp将尝试替代地址。这

2020-09-01 09:34:59 686

原创 EventBus3源码分析

引入上一篇文章EventBus基本使用中讲述了EventBus使用的三个步骤第一步定义事件public class MessageEvent { public final String message; public MessageEvent(String message) { this.message = message; }}第二步准备观察者和订阅方法@Overridepublic void onStart() { sup

2020-08-26 09:47:12 71

原创 EventBus3基本使用与进阶配置

介绍EventBus是适用于Android和Java的发布/订阅事件总线。可简化活动,片段,线程,服务等之间的通信。代码更少,质量更高。基本使用项目配置EventBus依赖 implementation 'org.greenrobot:eventbus:3.2.0'定义事件 public class MessageEvent { }注册/解除订阅者和定义接受事件的方法,在Android中应该根据组件生命周期进行注册/解注册@Override public void on

2020-08-23 09:40:02 920

原创 Activity的任务栈和四大启动模式

前言在安卓系统中默认每次启动一个Activity时,系统会创建一个实例,并按照先进后出的原则放入任务栈中,当我们按back键时,就会有一个activity从任务栈顶移除,重复下去,直到任务栈为空,系统就会回收这个任务栈。但是这样以来,系统多次启动同一个Activity时就会重复创建多个实例,这种做法显然不合理,为了能够优化这个问题,Android提供四种启动模式来修改系统这一默认行为。任务栈任务栈是一个Android应用中所有Activity的集合,安卓系统使用栈的方式来管理其中的Activity,这

2020-08-16 10:21:12 282

原创 Android应用崩溃重启以及被系统Kill场景分析

Android应用崩溃重启Android应用开发过程中,当我们的应用发生Crash时异常退出,然后又自动启动跳转到未知页面,此时应用在崩溃前保存的全局变量被重置,用户状态丢失,显示数据错乱。不同场景表现的现象经测试,在 Android 的 API 21 ( Android 5.0 ) 以下,Crash 会直接退出应用,但是在 API 21 ( Android 5.0 ) 以上,系统会遵循以下原则进行重启:包含Service,如果应用Crash的时候,运行着Service,那么系统会重新启动Serv

2020-08-10 21:29:45 1150

原创 管理Android应用程序的资源

管理Android应用程序的资源什么是资源Android应用程序由两部分组成,功能部分(代码指令)和数据部分(资源)功能部分是决定你应用程序行为的代码,包括程序运行的任何算法,资源包括了文本字符串、样式和主题、尺寸、图片和图标、音频文件、视频以及应用使用的其他数据存储应用程序资源Android的资源文件不同于.java类。是分开存在Android项目内,所有的资源必须存放在项目的/res目录下的特定子目录下,其目录名必须是小写。不同的资源存放在不同的目录中,当创建一个Android项目时,生

2020-08-05 22:55:06 90

原创 ViewGroup的LayoutParams理解

LayoutParams是ViewGroup的一个内部类,声明方式如下public static class LayoutParams { public static final int MATCH_PARENT = -1; public static final int WRAP_CONTENT = -2; public int width; public int height;

2020-08-03 21:46:16 808

原创 Android中View的绘制机制

View的绘制机制在生活中,我们如果绘制一幅图,想象一下我们的绘制流程是怎么样的?我要确定我绘制的这幅图大概有多大我要确定我绘制的这幅图在什么位置我要怎么利用画笔把这幅图绘制出来在Android中我们绘制一个View通常也是这样的流程先确定View的大小(measure)再确定View的位置(layout)最后确定View的样子(draw)在Android中View视图结构自上而下是树形结构ViewGroup->View…最顶层的View是DecorView(它继承自Fra

2020-07-31 14:25:39 183

原创 设计模式之模板方法模式

什么是模板方法模式定义一个操作中的算法骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。总的来说,模板模式就是通过抽象类来定义一个逻辑模板,逻辑框架、逻辑原型,然后将无法决定的部分抽象成抽象方法交由子类来实现。这么看来,模板就是定义一个框架,比如盖房子,我们定义一个模板:房子建造需要地基、墙壁、门、窗等等,但是要什么样的门,什么样的窗,这些并不在模板中描述,这个交给子类来实现。建造房屋例子模板抽象类:HouseTemplatepublic ab

2020-07-27 09:17:30 54

原创 设计模式之代理模式

概述代理模式是为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个客户不想或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。代理模式有两种,静态代理和动态代理。涉及角色抽象角色:声明真实对象和代理对象的共同接口。代理角色:代理对象角色内部含有对真实对象的引用,从而可以操作真实对象,同时代理对象提供与真实对象相同的接口以便在任何时刻都能代替真实对象。同时,代理对象可以在执行真实对象操作时,附加其他的操作,相当于对真实对象进行封装。真实角色:代理角

2020-07-21 15:23:03 44

原创 设计模式之责任链模式

简介责任链模式为请求创建一个接收者对象链,每个接收者都包含对另一个接收者的引用,如果一个对象不能处理该请求,那么它会把请求传给下一个接收者,依此类推。责任链模式避免了请求的发送者和接收者耦合在一起,让多个对象都有可能接收请求,将这些对象连成一条链,并且沿着这条链传递请求,直到有对象处理它为止。优缺点优点:降低耦合度。它将请求的发送者和接收者解耦简化了对象,使得对象不需要知道链的结构 ,增强给对象指派职责的灵活性,允许动态地新增或者删除责任链,增加新的请求处理类方便。缺点:不能保证请求一定被

2020-07-17 23:15:15 56

原创 设计模式之建造者模式

建造者模式提供对象的灵活构建建造者设计模式将一个复杂对象的构造与它的表示分离,使同样的构建过程可以创建不同的表示怎么理解这句话呢?其实多读两遍也就理解了,我们知道对象是由多个属性构造的,尤其是构造一个复杂对象,那么它包含的属性更多,比如我现在构建一个Person对象。思考一下Person对象有哪些属性呢?姓名、年龄、性别、爱好、学历等。其中姓名、年龄和性别那是必要属性,没它不行啊。至于爱好、学历可有无,那么Person类声明如下public class Person{ String name;

2020-07-13 21:24:03 63

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

观察者设计模式观察者模式定义了对象间的一对多依赖。具体可以描述为一个主题对象依赖多个观察者对象,那么当主题发生变化的时候,就可以通知到所有的观察者,通常也称主题对象为被观察者对象。上面的定义较为理论化,举一个现实生活中的例子,在早期,我们获取新闻都是通过看报的方式,我们需要到报刊订阅我们想要的新闻,当报刊有新闻发布时,这时候会通知到我们。简单说就是我们订阅了报刊新闻,当报刊新闻有发布的时候,这时候会通知到我们,所以观察者模式也称为发布-订阅模式由此得知,我们如果要实现一个观察者模式,所需要的角色有哪

2020-07-10 22:49:26 68

原创 Java单例模式的思考

单例模式的特征私有的构造函数提供静态变量提供静态的获取实例方法单例模式六种写法饿汉式单例模式public class Singleton { private static Singleton sInstance = new Singleton(); private Singleton() { } pu

2020-07-06 21:59:40 70

原创 Android中类加载机制解析

Android中的ClassLoaderJava中的ClassLoader是加载class文件,而Android中的虚拟机无论是dvm还是art都只能识别dex文件。因此Java中的ClassLoader在Android中不适用。Android中的java.lang.ClassLoader这个类也不同于Java中的java.lang.ClassLoader。Android中的ClassLoader类型也可分为系统ClassLoader和自定义ClassLoader。其中系统ClassLoader包括3种

2020-07-03 23:34:24 158

原创 Android中SharedPreferences源码解析与性能优化

SP XML文件与SharedPreferences对象关系解读data/data/packagename/shared_prefs 中的xml文件,以下简称sp文件ContextIml对象中通过Map集合缓存了多个SharedPreference对象,该Map集合是全局的,key对应shared_prefs文件名,value对应SharedPreferenceImpl(SharedPreferences接口的实现类)对象。因此,shared_prefs文件与内存中的SharedPreferencesI

2020-06-30 13:37:42 197

原创 Android事件分发机制流程解读

事件分发的顺序Activity->Window->DecorView->ViewGroup->View事件的类型ACTION_DOWN、ACTION_MOVE、ACTION_UP、ACTION_CANCEL通常一个事件序列是这样的ACTION_DOWN 事件是一个事件的起点,然后伴随着多个ACTION_DOWN事件,然后是ACTION_DOWN,中间可能会收到一个ACTION_DOWN事件Activity的事件分发//Activity的dispatchTouchEvent

2020-06-28 10:39:57 196

原创 MQTT源码分析

MQTT介绍MQTT是个轻量级的消息订阅/发布协议,基于TCP协议,在物联网中应用较广,当然也有的公司拿MQTT协议来做Push或IM。MQTT协议有很多客户端/服务端的实现,如Eclipse Paho就是其中一个。本文不对MQTT协议本身做介绍,而是主要分析下一个Paho MQTT客户端的代码实现。Paho MQTT开源项目基本使用发布端代码案例/** *发布端 */public class PublishSample { public static void main(Str

2020-06-24 14:06:34 438

原创 Android中的IntentService解析

IntentService简介IntentService是继承与Service的。所以IntentService也是一个Service,拥有Service的所有特性。public abstract class IntentService extends ServiceIntentService相比于Service有什么区别呢?IntentService可以执行一些耗时任务,并且任务完成后会服务会自动销毁。具体的源码分析如下://IntentService onCreate()方法public v

2020-06-22 10:44:13 124

原创 Android中的HandlerThread分析

HandlerThread简介HandlerThread,顾名思义,是一个在其内部可以使用Handler的线程,其实本质是HandlerThread线程内部构造了一个Looper环境。源码如下:在其run方法中初始化了一个Looper的环境,创建了Looper对象并且开启了loop循环。//HandlerThread run()方法@Override public void run() { mTid = Process.myTid(); Looper.prepa

2020-06-19 10:18:57 149

原创 Android APK体积优化

随着Android移动开发的需求越来越复杂,我们不可避免的遇到发布出去的apk体积越来越大的问题, 目前超过10MB、20MB的apk已经是很常见的事情了,但是依然能够看到一些apk的体积控制的很小。apk体积增大源于:新需求不断的提出需要支持高分辨率的屏幕而加入了高分图片依赖了更多的第三方库本文将从我自己的经历项目中探讨如何有效减小apk的体积。减小Apk体积是一件很有用处的and...

2018-09-03 22:05:28 709

原创 Android架构组件 Lifecycle

概述每个Android开发者都应该面对过生命周期问题,即操作系统启动、停止和销毁Activity。这意味着开发者需要根据生命周期的不同阶段,有针对性地管理组件状态,比如用于更新用户界面的可观察对象。生命周期管理(Lifecycles)帮助开发者创建“可感知生命周期的”组件,让其自己管理自己的生命周期,从而 减少内存泄露和崩溃的可能性。生命周期库是其他架构组件(如 LiveData)的基础。...

2018-08-26 13:31:40 208

原创 MySQL数据库学习

虽然笔者从事的是Android客户端的开发,平时和数据库打的交道并不多,但是我们对于数据库这一块的学习还是很重要的,今天笔者想总结下MySQL关系型数据库的一些常用知识点数据库概述一、常见的概念数据库(DataBase):数据库是按照数据结构来组织、存储和管理数据的仓库。数据库管理系统(Database Management SystemDBMS):是专门用于管理数据库的计算机系统...

2018-08-13 20:41:03 34833 2

原创 Java的类加载机制

最近一直在回顾复习Java知识,希望能够从更深的角度去理解Java语言,也在从头开始看Thinking In Java,今天想总结下在Java的类加载机制。系统可能在第一次使用某个类的时候加载该类,也可能采用预加载机制来加载某个类。当使用Java命令运行某个Java程序的时候,该命令将会启动一个java虚拟机进程,不管该Java程序有多么复杂,该程序内部启动了多少个线程,他们都处在java虚拟机进...

2018-08-06 22:56:56 142

原创 Android中如何优雅的定义常量

在Android开发中如何更好的定义常量本篇博客是笔者的第一篇博客,其实很早之前就有了写博客的想法,但是奈何万事开头难,一直没有下定决心,随着自己经验的增加,有些知识会经常遗忘,对于某些难题,可能当时有了解决方案,但是如果不做笔记,不做记录,过不了多久就会遗忘,笔者深有体会。这会大大降低我们的工作效率,所以笔者下定决心,坚持写博客,通过博客来记录自己平时的知识积累,通过博客也让自己的知识能够分...

2018-08-04 11:26:17 10198 3

Android Binder通信案例

AIDL实现IPC,手写Binder实现IPC,Binder连接池的设计

2020-12-29

空空如也

空空如也

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

TA关注的人 TA的粉丝

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