Mark Xu 的博客

记录精彩的程序人生

Java 内存泄漏学习

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

Java 引用学习

本文对 Java 引用相关的基础知识进行梳理、学习。什么是引用 Studentxiaoming=newStudent("xiaoming",15); 上面这一行简单代码中右侧 new 关键字在内存中为对象开辟了空间,对象保存在内存的 “堆” 中左侧 xiaoming 指代一个 Student 对象,称为对象引用,保存在内存的 “栈” 中等号赋值时,将刚刚右侧创建的对象的地址赋予给对象引用也就是说,引用指向堆上的对象,引用的值为

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 的源码分析,源码分析经验不足,如有错误,还请指出。观察者模式本段引自图说设计模式模式动机建立一种对象与对象之间的依赖关系,一个对象发生改变时

productFlavor 的使用

最近工作项目中的一个需求,针对不同运行环境下加载不同的系统配置文件。大家肯定都想到了使用 Gradle 脚本的 productFlavor 来实现,也就是多渠道打包经常用的方式。但是我在使用过程中还是遇到了一些坑,主要还是自己对 productFlavor 以及 Gradle 脚本还不足够熟悉,所以实践加总结记录本文。构建变体(BuildVariant)每个构建变体都代表为应用构建的一个不同版本。如为一个应用构建免

Android Gradle 使用技巧整理

对于 Android 应用开发者来说,Gradle 大家用的应该是相当的频繁了,在我们跑出第一个 HelloworldApp 时,我们就已经开始和 Gradle 打交道了。Gradle 吸纳了 ant 灵活的脚本特性、Maven 丰富的依赖管理策略和强大的插件式环境,拥有如此强大的编译工具,作为 Android 应用程序开发者,自然不应该放过对它的学习。我在这一周工作的业余时间对 Gradle 进行了学习,主要学习资料为徐医生的

AsyncTask 源码分析

关于 Android 源码分析,引用郭霖老师博客的一段话:简单概括就是八个字:抽丝剥茧、点到即止。应该认准一个功能点,然后去分析这个功能点是如何实现的。但只要去追寻主体的实现逻辑即可,千万不要试图去搞懂每一行代码都是什么意思,那样很容易会陷入到思维黑洞当中,而且越陷越深。因为这些庞大的系统都不是由一个人写出来的,每一行代码都想搞明白,就会感觉自己是在盲人摸象,永远也研究不透。如果只是去分析主体的实现逻辑

使用 MediaCodec、jlibrtp 实现视频通话

公司的项目中视频通话模块计划采用的方案包括开源库 Linphone、MediaCodec 实现、WebRTC 等,由于目标设备硬件配置较差,采用软编软解的 Linphone 在性能上遇到了瓶颈。因此最近在尝试使用 MediaCodec 和 rtp 库 jlibrtp 来实现视频通话。在本次实践中遇到的问题包括:1、分包、合包问题 3、在 UI 线程发送数据的问题(sendData 的耗时操作解决)4、Android 相机方向问题 5

探寻 Android so 库

做 Android 开发,就肯定会涉及到不同架构处理器的适配问题,所以今天花时间对手机 CPU 的相关知识进行整理学习。一句话总结:一种 CPU 架构 = 一种对应的 ABI 参数 = 一种对应类型的 so 库。基础介绍在开发 Android 应用时,对一些影响性能的计算经常会使用 C/C++ 实现,我们称其为 Native 代码,同时通过 JNI 协调 Java 与 Native,以共同完成应用的功能。应用程序二进制接口(ApplicationB

Android 消息机制源码分析

这个月的计划是拿下 Android 开发中的多线程,在复习了 java 多线程基础知识后,开始啃 Android 的消息机制,由于平时使用挺多的了,所以这次尝试从源码入手,加深理解。感谢各位前辈的分享!一句话总结:Looper 不断从 MessageQueue 中取出一个 Message,然后交给其对应的 Handler 处理。先上一幅整体关系图,来自郭神 Handler 处理 Message 将某个 Message 压入 Messag

Gson 解析多态对象之 RuntimeTypeAdapterFactory 的使用

Gson 作为亲儿子库,在 json 解析库的使用量上绝对是排第一的,近期的项目遇到需要解析多态对象的需求,我们平常的简单使用肯定是没办法满足需求的,在经过 Google 后,发现 Gson 已经为我们提供了 RuntimeTypeAdapterFactory 适配器,只需要加入到项目即可。本文翻译自 Gson 源码。原文见 https://github.com/google/gson/blob/master/extras

Android 动态加载 view 实践

工作中的项目需求如下:需要实现动态添加子 view 到父布局,并且子 view 的尺寸和类型都不确定。Google 查找资料并没发现相关已实现库,自己动手、丰衣足食,最终采用 java 反射 + 自定义 viewgroup 实现。demo 链接:https://github.com/xcy396/FreeLayoutDemo 实现的方法是通过反射实现动态确定子 view 类型,自定义 viewgroup 实现动态添加。关键代码如下:

2016 年终总结

今天是圣诞节,2016 年的最后一个休息日,坐在华大的自修室写代码。像各位大神们学习,也总结一下自己的 2016 年。今年应该算是我职业生涯中极为重要的一年,选择了新的方向(Android 开发),开始了新的工作,觉得自己在这一年中学到了很多,也成长了很多,但是学的越多,愈发觉得自己不会的太多。一眨眼已经毕业两年半了,岁月不等人。这篇总结姑且记录一下今年,计划一下明年吧,大家一起加油!2016 年总结学习也许

Android VoIP 开发学习笔记

VoIP(VoiceoverIP)也即网际协议通话技术,是一种语音通话技术。经由网际协议(IP 也即 InternetProtocol)来达成语音通话与多媒体会议,也就是经由互联网来进行通信。IP 电话通过把语音信号经过数字化处理、压缩编码打包、透过网络传输、然后解压、把数字信号还原成声音,让通话对方听到。目前常用的协议有 H.323、SIP、MEGACO 和 MGCP。本文为杜金房老师《FreeSWITCH 权

Android 回调机制的理解

关于 Android 中的回调问题,其实学习 Android 没多久就接触到了,只是那时候根本没理解回调的真正含义。我是学习郭霖老师的《第一行代码》入门的 Android 开发,刚开始没多久就接触到了 AndroidView 的点击事件,其实 AndroidView 的点击方法 onClick() 就是一个回调方法,当用户点击 View 就执行这个方法,Activity 和 View 之间也是互相调用的关系。我自己是相当长一段时间处