Mark Xu 的博客

记录精彩的程序人生
Android 0 篇文章

再谈 MVC、MVP 与 MVVM

最近在主导公司的 Android 客户端架构演进工作,我们再次来认识下 MVC、MVP 与 MVVM。MVC 模式概述 MVC 基于 Model-View-Controller,即模型 - 视图 - 控制器的架构模式进行设计。模型对象:存储着优雅的数据和业务逻辑,模型类通常用来映射与应用相关的一些事物,如用户、商店里的商品、服务器上的图片或者一段电视节目。模型对象不关心用户界面,它存在的唯一目的就是存储和管理应用数据。应用的

Android 图片加载(二)-- Bitmap 高效加载

上一章中,我们介绍了图片的基本知识,接下来我们看看在 Android 中如何高效加载图片呢。在 Android 中,我们使用 Bitmap 对象来描述我们前面所说的图片,Bitmap 本身的含义为:位图,我们用它来处理图片。那么 Bitmap 对象要如何得到呢?Bitmap 对象 Android 系统 API 中提供了一个工厂类 BitmapFactory,用于从文件系统、资源、输入流以及字节数组中加载出一个 Bitmap 对象。p

Android 图片加载(一)-- 图片基础知识

图片加载在 Android 应用开发中,也算是很重要的一块了。移动设备的内存都是很宝贵的,而图片又是内存占用大户,所以如何优化图片加载,优化 App 内存占用,是一个 Android 开发工程师的基本必备技能了。最近准备写一系列图片加载相关的文章,查漏补缺,提升自己的开发实力。图片的本质题图是台风 “山竹” 来临前一天拍摄的,晴空万里,五彩缤纷,异常宁静。这张图使用手上的红米手机拍摄,原图尺寸为 4000*3000p

ViewStub 源码分析

写项目的过程中发现,在需要根据适当条件进行相应 UI 展示时,代码中充斥了 setVisibility 相关的代码,相当混乱。我们可以使用 ViewStub 来简化相应的逻辑,并且 ViewStub 大小为 0,运行时才进行懒加载,所以性能上也有一定优势。本文对 ViewStub 的源码进行分析,以使用的更得心应手!简单使用 ViewStub 的使用很简单,在布局文件中像引入其他控件一样引入 ViewStub:<ViewStu

记一次小米 note3 开机黑屏处理过程

从第一次购买小米的蓝牙音箱,到后面自己以及推荐家人购买小米、红米手机,再到购买路由器、智能摄像头、耳机这些周边产品,自己也慢慢成为了一个米粉。今天下班后,女朋友说她的小米 note3 黑屏死机了,重启无效。顿时对小米略感失望,两千块钱的手机刚用半年而已。想到送到售后八九不离十又是给刷机处理,自己又不想丢失手机内的数据,所以决定自己尝试解决,经过半个多小时成功解决。症状首先,说明下手机的症状:开机后显示正

Dagger2 学习总结及源码浅析

Dagger2 是一个解决 Android 或 Java 的依赖注入类库,关于 Dagger2 的教程网上已经很多了,此处推荐《Dagger2 入门, 以初学者角度》和《Android:dagger2 让你爱不释手 - 基础依赖注入框架篇》这两篇,对照教程可以基本学会使用方法。本文算是我自己在学习 Dagger2 过程中的一个精华汇总吧,同时外加实现源码分析。学习总结总览 1、Java 中万物皆对象,每一个对象可以拥有很多成员变量

公司项目代码优化总结

公司的 Android 端项目已经历时五年有余了,经历了多名开发者编写,所以难免风格各异。我在接手项目后,在实现版本迭代的同时,也顺手对以前的代码做了部分优化。本文总结了在过程中遇到的一些问题,归纳为性能,视图,维护等几个方面。当然,有些问题见仁见智,欢迎讨论!性能 ArrayMap、SparseArray 替代 HashMapHashMap 是 Java 中的常用集合类型,大家都非常的熟悉。Android 平台上,

避免空指针和下标越界的方案总结

最近处理了一批公司项目的线上 bug,其中以空指针异常和下标越界占大多数,本文结合项目中遇到的各种空指针和越界问题,总结了产生的原因,及如何编码才能更大程度上减少空指针和下标越界的发生。空指针空指针异常出现的原因可能的原因有如下几个:对象没有初始化就进行操作对象已经初始化过,但是被回收或者手动置为 null 进程被杀死后静态变量没有初始化 API 返回脏数据,解析出的对象状态异常有效避免空指针异常的编码习惯 1

ButterKnife 源码分析

ButterKnife 框架是我们日常使用最频繁的框架之一,本文对 ButterKnife8.8.1 版本进行源码分析。整体流程编写代码时对目标元素进行注解编译时注解处理器会扫描注解,并通过 JavaPoet 自动生成 Java 文件调用 ButterKnife.bind() 方法时,会通过反射拿到之前为目标类生成的 TargetClassName_ViewBinding 类,并调用其构造方法,完成绑定具体分析源码组成 B

Retrofit 使用总结及源码分析

本篇文章对 Retrofit 用法进行简单记录,并进行相关的源码分析。整体说明 Retrofit 对网络请求接口进行了封装,实际执行网络请求的依然是 OkHttp。Retrofit 接口层实际是对 OkHttp 中 Request 的封装,采用注解的形式来描述网络请求参数。Retrofit 使用在学习 Retrofit 使用之前我们先回顾下 OKHttp 的工作方式,一个标准的 OkHttp 请求格式为 mClient.newCall

OkHttp3 源码分析(一)

本篇文章对 OkHttp3 的源码进行分析,学习其设计思想。OkHttpClient 首先从 OkHttpClient 的构建说起。由官方文档可知,在绝大多数 App 中,我们都应该只拥有一个 OkHttpClient 对象,这样所有的 Http 请求可以共用 Response 缓存、共用线程池以及共用连接池,达到节省延迟和内存的目的。关于 OkHttpClient 我们暂时只关注两点:Builder 模式和 Call 接口。Buil

Android 手机屏幕那些事儿

最近公司的 Android 设备准备进行硬件升级,谈及屏幕时,大家对于相关的一些知识点具有不同的认知。因此我搜集了互联网上关于 Android 手机屏幕的相关资料,总结、记录、分享于此。分辨率屏幕尺寸屏幕尺寸指屏幕对角线的长度,单位:英寸 1 英寸 = 2.54 厘米屏幕比例屏幕比例为手机屏幕的纵横比(高宽比)屏幕比例值等于分辨率比例值,即 16/9=2560/1440 当今智能手机主流屏幕比例为 16:9 约等于 1.777

Java 内存泄漏学习

本文对网络上的内存泄漏相关知识进行分析、学习,并对一些知识点提出了自己的见解,包括什么是内存泄漏、可能出现内存泄漏的情况以及如何避免内存泄漏。什么是内存泄漏存在下面的这种对象,这些对象不会被 GC 回收,却占用着内存,即为内存泄漏(简单说:存在已申请的无用内存无法被回收)该对象是可达的,即还在被引用着该对象是无用的,即程序以后不会再使用该对象可能出现内存泄漏的情况长生命周期的对象持有短生命周期的引用,就

LayoutInflater 的 inflate 方法分析

inflate 一词本意是膨胀、充气,在 LayoutInflater 里我们可以把它理解为加载出来的意思,LayoutInflater 即布局加载器,从指定的 xml 资源文件中加载出具有层次的视图结构。inflate 方法应该是我们日常码代码中最常用的方法之一,今天对 inflate 方法进行分析。Viewview=LayoutInflater.from(parent.getContext()).inflate(

View 三大流程源码分析

View 是 Android 应用开发中相当重要的角色,重要程度丝毫不亚于四大组件,甚至远高于 Broadcast 和 ContentProvider。本文为学习《Android 开发艺术探索》中 View 的工作原理后,自己对于 View 的三大流程的源码分析。ViewRootView 的绘制流程从 ViewRoot 的 performTraversals 方法开始,经过 measure、layout 和 draw 将一个 View 绘制出

Binder 原理分析

Binder 是 Android 中非常重要的机制,本篇文章从 AIDL 入手分析 Binder 的原理,主要是进行宏观上的理解,暂不纠结细节及底层源码。# 动态可加载内核模块机制 Linux 动态可加载内核模块机制:模块是具有独立功能的程序,它可以被单独编译,但不能独立运行。它在运行时被链接到内核作为内核的一部分在内核空间运行。在 Android 中,通过添加 Binder 驱动这个模块运行在内核空间,负责各个用户进程通过 B

Android 事件分发机制源码分析(二)按键事件

本篇文章主要分析应用层在接收到按键事件后的分发流程,对于 Framework 层获得按键事件、分发传递给应用层等相关知识,在后期 Framework 层源码学习时再做分析。项目中只要在 Activity 中重写 dispatchKeyEvent() 方法,就可以进行事件处理和拦截了,那我们从 Activity 类的 dispatchKeyEvent() 方法看起:分发顺序在分发的任何一步有分发者进行消费,即返回 true 时,

Android 事件分发机制源码分析(一)触摸事件

最近的工作需要对 Android 按键事件分发进行处理,而自己对于 Android 事件分发机制的理解并不是很透彻。因此周末对 Android 触摸事件分发机制进行源码分析、总结,下周对按键事件进行分析、总结。触摸事件分发机制的原则事件在从 Activity 向下传递的过程中,可以被拦截,并被拦截者使用、消费如果事件被消费,就意味着事件信息传递终止当前分发者决定不拦截事件时,无法使用事件,只能继续向下进行分发事件回

EventBus 3.0 源码分析(二)注解处理器的使用

上一篇文章对 EventBus 进行了整体的源码分析,看到 EventBus3.0 获取订阅事件的注解信息共有两种方式,分别是通过 EventBusAnnotationProcessor 注解处理器和运行时通过反射获取,本文主要对这两种方式进行源码分析,并对编译时注解和运行时注解进行拓展学习。在 EventBus 的 findSubscriberMethods 方法中可以看到:List<SubscriberMethod

EventBus 3.0 源码分析(一)整体分析

EventBus 是 Android 平台非常优秀的事件总线开源库,来自于德国的 greenrobot 团队,该团队旗下还有大名鼎鼎的 greenDAO。EventBus 足够快速、轻量,安装量超过 100,000,000+!足以看出其热门程度。本文是我对 EventBus3.0 的源码分析,源码分析经验不足,如有错误,还请指出。观察者模式本段引自图说设计模式模式动机建立一种对象与对象之间的依赖关系,一个对象发生改变时