- 博客(40)
- 收藏
- 关注
原创 安居客 Android App 走向平台化
安居客 Android App 距离上次的模块化/组件化重构已经两年多了,重构之后很好的支撑了两年多以来的业务发展。但这个世界总是在向前走的,没有任何一种架构能够一劳永逸的解决所有问题,外部环境的不断变化相应的也要求项目架构做出改变,以此来应对环境变化所带来的挑战。本文分享的就是我们安居客 App 团队这次向平台化转型的背景、转型过程中所面临的问题、挑战、我们的解决方案以及我个人在这个过程中的...
2019-10-22 13:04:32
2986
1
原创 为什么我不建议你在当前购买 5G 手机
首发于公众号:BaronTalk,欢迎关注每年的八九月份都是各大厂商发布年自己旗舰机的时候,最近 vivo、oppo、小米、华为、苹果接连发布了自己的年度旗舰,这当中除了苹果,其它厂商均发布了 5G 版本手机。恰逢国庆,势必会迎来一波换机潮,而各大厂商发布的 5G 手机很可能会成为很多同学的首选,今天我要来给准备购买 5G 手机的同学泼泼冷水。先抛出观点:**对于普通消费者,当前不适合购...
2019-09-30 21:16:52
32707
89
原创 邮件这样写,PK 掉 99% 的同事
首发于微信公众号:BaronTalk,欢迎关注!工作中总免不了需要正式的邮件来沟通协调工作,有跨大团队沟通的,也有向老板汇报工作情况的。每每此时,总是小心谨慎,邮件发出后又常洋洋自得,总觉得自己的邮件条理清晰、结构合理、内容详实,横竖都算得上是专业度颇高的邮件了。可事后回头来看,又觉之前的邮件颇有些青涩稚嫩,不恰当处比比皆是。细细推敲下来,我们在日常职场中的邮件写作还是有些讲究的。因此今天...
2019-08-16 13:03:46
11341
13
原创 系列 | 深入理解Java虚拟机六(高效并发)
首发于微信公众号:BaronTalk,欢迎关注!高效并发是 JVM 系列的最后一篇,本篇主要介绍虚拟机如何实现多线程、多线程间如何共享和竞争数据以及共享和竞争数据带来的问题及解决方案。一、Java 内存模型与线程让计算机同时执行多个任务,不只是因为处理器的性能更加强大了,更重要是因为计算机的运算速度和它的存储以及通信子系统速度差距太大,大量的时间都花费在磁盘 I/O 、网络通信和数据库访...
2019-08-16 12:36:46
918
1
原创 系列 | 深入理解Java虚拟机五(程序编译与代码优化)
首发于微信公众号:BaronTalk,欢迎关注!对于性能和效率的追求一直是程序开发中永恒不变的宗旨,除了我们自己在编码过程中要充分考虑代码的性能和效率,虚拟机在编译阶段也会对代码进行优化。本文就从虚拟机层面来看看虚拟机对我们所编写的代码采用了哪些优化手段。一. 早期优化(编译期优化)Java 语言的「编译期」其实是一段「不确定」的操作过程。因为它可能是一个前端编译器(如 Javac)把 ...
2019-08-16 12:32:50
414
原创 系列 | 深入理解Java虚拟机四(字节码执行引擎)
首发于微信公众号:BaronTalk,欢迎关注!执行引擎是 Java 虚拟机最核心的组成部分之一。「虚拟机」是相对于「物理机」的概念,这两种机器都有代码执行的能力,区别是物理机的执行引擎是直接建立在处理器、硬件、指令集和操作系统层面上的,而虚拟机执行引擎是由自己实现的,因此可以自行制定指令集与执行引擎的结构体系,并且能够执行那些不被硬件直接支持的指令集格式。在 Java 虚拟机规范中制定了...
2019-08-16 12:28:05
324
原创 系列 | 深入理解Java虚拟机三(类加载机制)
首发于微信公众号:BaronTalk,欢迎关注!上一篇文章我们介绍了「类文件结构」,这一篇我们来看看虚拟机是如何加载类的。我们的源代码经过编译器编译成字节码之后,最终都需要加载到虚拟机之后才能运行。虚拟机把描述类的数据从 Class 文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的 Java 类型,这就是虚拟机的类加载机制。与编译时需要进行连接工作的语言...
2019-08-16 12:24:13
374
2
原创 系列 | 深入理解Java虚拟机二(类文件结构)
首发于微信公众号:BaronTalk,欢迎关注!之前在阅读 ASM 文档时,对于已编译类的结构、方法描述符、访问标志、ACC_PUBLIC、ACC_PRIVATE、各种字节码指令等等许多概念听起来都是云山雾罩、一知半解,原因就在于对类文件结构和类加载机制不够了解。直到后来细读了《深入理解 Java 虚拟机》中虚拟机执行子系统的相关内容,才建立了清晰的认知。如果你也和我一样,不了解类结构和类加...
2019-08-16 12:17:12
288
原创 系列 | 深入理解Java虚拟机一(自动内存管理机制)
欢迎关注微信公众号:BaronTalk,获取更多精彩好文!书籍真的是常读常新,古人说「书读百遍其义自见」还是蛮有道理的。周志明老师的这本《深入理解 Java 虚拟机》我细读了不下三遍,每一次阅读都有新的收获,每一次阅读对 Java 虚拟机的理解就更进一步。因而萌生了将读书笔记整理成文的想法,一是想检验下自己的学习成果,对学习内容进行一次系统性的复盘;二是给还没接触过这部好作品的同学推荐下,...
2019-06-12 15:27:18
525
原创 深入理解Java虚拟机(自动内存管理机制)
书籍真的是常读常新,古人说「书读百遍其义自见」还是很有道理的。周志明老师的这本《深入理解 Java 虚拟机》我细读了不下三遍,每一次阅读都有新的收获,每一次阅读对 Jav...
2019-06-10 08:30:00
904
2
转载 58无埋点数据采集技术在Android端实践
本文转载自公众号 58架构师,已经作者授权!作为国内最大分类信息生活服务平台,58集团旗下各个产品都会投入大量人力进行用户行为的分析,来提升运营效率。但是各个产品对用户行...
2018-06-15 20:30:00
614
原创 Android 性能监控系列一(原理篇)
一. 前言性能问题是导致 App 用户流失的罪魁祸首之一,如果用户在使用我们 App 的时候遇到诸如页面卡顿、响应速度慢、发热严重、流量电量消耗大等问题的时候,很可能就会卸载掉我们的 App。而往往获取用户的成本是高昂的,因此因为性能问题导致用户流失的情况是我们要极力避免的,做不好这一点是我们开发人员的失职。去年我们团队完成了整个项目架构方面的重构(有兴趣的同学可以参考我之前的文章安居...
2018-06-05 15:26:28
1438
原创 Android APM 系列一(原理篇)
图片来自 https://unsplash.com一. 前言性能问题是导致 App 用户流失的罪魁祸首之一,如果用户在使用我们 App 的时候遇到诸如页面卡顿、响应速度慢...
2018-06-05 09:00:00
1494
1
原创 我们和优秀工程师的差距在哪儿
关注微信公众号:BaronTalk,获取更多精彩好文。我相信每个工程师都曾怀揣一个成为技术大牛的梦想,可是真正走向技术大牛这条路的少之又少。工作中我们常常会发现,有些同学工作没几年但成长迅速;很快就能走向团队核心岗位,成为一名优秀的工程师;而有些同学工作几年后却在公司里默默无闻,能力和职位上都没有太大提升,得过且过最终沦为一名普普通通的码农。所以我常常会有感慨,太多人(包括我自己)...
2018-04-25 15:29:49
432
2
原创 写给 Android 应用工程师的 Binder 原理剖析
刚刚开通了微信公众号:BaronTalk,之前专栏上的文章也陆续完成了搬迁。后续会持续保质保量的输出,关注一下吧!!! :-)一. 前言这篇文章我酝酿了很久,参考了很多资料,读了很多源码,却依旧不敢下笔。生怕自己理解上还有偏差,对大家造成误解,贻笑大方。又怕自己理解不够透彻,无法用清晰直白的文字准确的表达出 Binder 的设计精髓。直到今天提笔写作时还依旧战战兢兢。Bin...
2018-04-10 23:03:21
328
原创 RxJava系列五(组合操作符)
这一章我们接着介绍组合操作符,这类operators可以同时处理多个Observable来创建我们所需要的Observable。组合操作符主要包含:MergeStar...
2017-12-31 19:19:10
196
原创 RxJava系列二(基本概念及使用介绍)
前言上一篇的示例代码中大家一定发现了Observable这个类。从纯Java的观点看,Observable类源自于经典的观察者模式。RxJava的异步实现正是基于观察者模...
2017-12-31 19:19:10
164
原创 RxJava系列七(最佳实践)
前言有点标题党了,其实谈不上什么最佳实践。前段时间公司实行996,所以也没什么时间和精力来更新博客(好吧~我承认是我懒~)。因此这篇文章只是简单的通过两个例子介绍了RxJ...
2017-12-31 19:19:10
174
原创 RxJava系列四(过滤操作符)
前面一篇文章中我们介绍了转换类操作符,那么这一章我们就来介绍下过滤类的操作符。顾名思义,这类operators主要用于对事件数据的筛选过滤,只返回满足我们条件的数据。过滤...
2017-12-31 19:19:10
163
原创 RxJava系列三(转换操作符)
前面两篇文章中我们介绍了RxJava的一些基本概念和RxJava最简单的用法。从这一章开始,我们开始聊聊RxJava中的操作符Operators,后面我将用三章的篇幅来分...
2017-12-31 19:19:10
141
原创 RxJava系列六(从微观角度解读RxJava源码)
前言通过前面五个篇幅的介绍,相信大家对RxJava的基本使用以及操作符应该有了一定的认识。但是知其然还要知其所以然;所以从这一章开始我们聊聊源码,分析RxJava的实现原...
2017-12-31 19:19:10
147
原创 RxJava系列一(简介)
前言提升开发效率,降低维护成本一直是开发团队永恒不变的宗旨。近一年来国内的技术圈子中越来越多的开始提及Rx,经过一段时间的学习和探索之后我也深深的感受到了RxJava的魅...
2017-12-30 08:00:00
136
原创 观察者模式(ObserverPattern)
场景我们接到一个来自气象局的需求:气象局需要我们构建一套系统,这系统有两个公告牌,分别用于显示当前的实时天气和未来几天的天气预报。当气象局发布新的天气数据(Weather...
2017-12-30 08:00:00
138
原创 Android 模块化探索与实践
本文首发于《程序员》杂志五月刊,此版本有部分纠错与调整一、前言万维网发明人 Tim Berners-Lee 谈到设计原理时说过:“简单性和模块化是软件工程的基石;分布式和容错性是互联网的生命。” 由此可见模块化之于软件工程领域的重要性。从 2016 年开始,模块化在 Android 社区越来越多的被提及。随着移动平台的不断发展,移动平台上的软件慢慢走向复杂化,体积也变得臃肿庞大;为了降低大型软件复
2017-05-06 00:00:44
1515
原创 Android WebView那些坑之上传文件
解决问题之前我们先来说说`WebView`上传文件的逻辑:当我们在Web页面上点击选择文件的控件(`<input type="file">`)时,会回调`WebChromeClient`下的`openFileChooser()`(5.0及以上系统回调`onShowFileChooser()`)。这个时候我们在`openFileChooser`方法中通过`Intent`打开系统相册或者支持该`Intent`的第三方应用
2017-03-02 16:09:53
2737
原创 神兵利器Dagger2
Dagger-匕首,鼎鼎大名的Square公司旗下又一把利刃(没错!还有一把黄油刀,唤作ButterKnife);故此给本篇取名神兵利器Dagger2。Dagger2起源于Dagger,是一款基于Java注解来实现的完全在编译阶段完成依赖注入的开源库,主要用于模块间解耦、提高代码的健壮性和可维护性。Dagger2在编译阶段通过apt利用Java注解自动生成Java代码,然后结合手写的代码来自动帮我们
2017-03-02 15:51:49
8408
1
原创 在Android项目中使用Java8
之前由于Android平台不支持Java8,如果我们想在Android项目中使用Lambda表达式、Stream API等Java8中的新特性就必须使用Retrolambda、Lightweight-Stream-API等第三方开源库来实现。现在Google爸爸终于让Android平台支持Java8了,这篇文章中便来和大家聊聊如何在Android项目中配置使用Java8。
2017-03-02 15:47:07
1531
原创 Java8新特性第3章(Stream API)
Stream作为Java8的新特性之一,他与Java IO包中的InputStream和OutputStream完全不是一个概念。Java8中的Stream是对集合功能的一种增强,主要用于对集合对象进行各种非常便利高效的聚合和大批量数据的操作。结合Lambda表达式可以极大的提高开发效率和代码可读性。
2017-03-02 15:45:57
620
原创 Java8新特性第2章(接口默认方法)
在Java中一个接口一旦发布就已经被定型,除非我们能够一次性的更新所有该接口的实现,否者在接口的添加新方法将会破坏现有接口的实现。默认方法就是为了解决这一问题的,这样接口在发布之后依然能够继续演化。
2017-03-02 15:44:12
592
原创 设计模式之观察者模式
场景我们接到一个来自气象局的需求:气象局需要我们构建一套系统,这系统有两个公告牌,分别用于显示当前的实时天气和未来几天的天气预报。当气象局发布新的天气数据(WeatherData)后,两个公告牌上显示的天气数据必须实时更新。气象局同时要求我们保证程序拥有足够的可扩展性,因为后期随时可能要新增新的公告牌。
2017-03-02 15:35:01
911
原创 RxJava系列番外篇:一个RxJava解决复杂业务逻辑的案例
之前写过一系列RxJava的文章,也承诺过会尽快有RxJava2的介绍。无奈实际项目中还未真正的使用RxJava2,不敢妄动笔墨。所以这次还是给大家分享一个使用RxJava1解决问题的案例,希望对大家在使用RxJava的时候有一点点启发。
2017-03-02 15:21:46
1831
原创 RxJava系列7(最佳实践)
这篇文章只是简单的通过两个例子介绍了RxJava在生产环境中的使用。不过本篇中的每个例子我都配上了完整的代码。> 按照计划这一期是要介绍RxJava框架结构和设计思想的,但是考虑到Netflix将在十月底发布RxJava2.0正式版;因此决定将RxJava框架结构和设计思想分析放到2.0正式版发布后再做。后续我也会有一系列的文章来介绍RxJava1.x和2.x的区别。
2017-03-02 15:20:30
966
原创 RxJava系列6(从微观角度解读RxJava源码)
通过前面五个篇幅的介绍,相信大家对RxJava的基本使用以及操作符应该有了一定的认识。但是知其然还要知其所以然;所以从这一章开始我们聊聊源码,分析RxJava的实现原理。本文我们主要从三个方面来分析RxJava的实现:* RxJava基本流程分析* 操作符原理分析* 线程调度原理分析> 本章节基于**RxJava1.1.9**版本的源码
2017-03-02 15:15:20
971
原创 RxJava系列5(组合操作符)
这一章我们接着介绍组合操作符,这类operators可以同时处理多个Observable来创建我们所需要的Observable。组合操作符主要包含: **`Merge`** **`StartWith`** **`Concat`** **`Zip`** **`CombineLatest`** **`SwitchOnNext`** **`Join`**等等。
2017-03-02 15:11:39
1754
原创 RxJava系列4(过滤操作符)
前面一篇文章中我们介绍了转换类操作符,那么这一章我们就来介绍下过滤类的操作符。顾名思义,这类operators主要用于对事件数据的筛选过滤,只返回满足我们条件的数据。过滤类操作符主要包含: **`Filter`** **`Take`** **`TakeLast`** **`TakeUntil`** **`Skip`** **`SkipLast`** **`ElementAt`** **`Debounce`** **`
2017-03-02 13:32:22
1597
原创 安居客Android项目架构演进
本文已授权微信公众号 AndroidDeveloper 独家发布。入职安居客三年从工程师到 Team Leader,见证了 Android 团队一路走来的发展历程。因此有心将这些记录下来与大家分享,也算是对自己三年来一部分工作的总结。希望对大家有所帮助,更希望能得到大家宝贵的建议。三网合并三年前入职时安居客在业务上刚完成了三网合并(新房、二手房、好租和商业地产多个平台多个网站合成现在的 anjuk
2017-02-27 14:25:58
20713
8
原创 RxJava系列3(转换操作符)
前面两篇文章中我们介绍了RxJava的一些基本概念和RxJava最简单的用法。从这一章开始,我们开始聊聊RxJava中的操作符Operators。
2016-10-27 11:53:18
1309
原创 RxJava系列2(基本概念及使用介绍)
上一篇的示例代码中大家一定发现了Observable这个类。从纯Java的观点看,Observable类源自于经典的观察者模式。RxJava的异步实现正是基于观察者模式来实现的,而且是一种扩展的观察者模式。
2016-10-27 11:46:34
1140
原创 RxJava系列1(简介)
提升开发效率,降低维护成本一直是开发团队永恒不变的宗旨。近一年来国内的技术圈子中越来越多的开始提及Rx,经过一段时间的学习和探索之后我也深深的感受到了RxJava的魅力。它能帮助我们简化代码逻辑,提升代码可读性。这对于开发效率的提升、后期维护成本的降低帮助都是巨大的。个人预测RxJava一定是2016年的一个大趋势,所以也有打算将它引入到公司现有的项目中来,写这一系列的文章主要也是为了团队内部做技术分享。
2016-10-27 10:55:17
1557
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人