如何劝退员工离职看待Jake Wharton 从Square离职

点击阅读原文
拆 JakeWharton 系列之 Picasso
8月3日 发布,来源:
作者博客/u/9fa7fc2f3733文章目录
Picasso 总览
图片框架的用例
如何阅读 Picasso 源码
线程和线程池
值得注意的细节
1前言 写这篇文章时候,JakeWharton 已经从 Square 离职半个月,令人唏嘘不已,追求更广阔的诗和远方想必都是大神们的宿命。当然,开源的价值不会随着你的地位、职业、企业的改变而消失或是贬值,这正是开源的魅力所在。
Picasso 延续了 JakeWharton 和 Square 开源库的风格,即小而美,且命名诗情画意。从三把刀(ButterKnife、Dagger 1、Scalpel)、Java 诗人(JavaPoet)到西班牙画家毕加索(Picasso),这些库的命名处处体现着技术和人文的结合。这些命名之下,理性的代码们显得感性且有温度。
2你将收获 通过本文和 Picasso 源码,你将收获:
图片框架的实现套路
缓存策略的应用
熟悉 HandlerThread 的应用场景
3Picasso 总览 简介
Picasso 、Glide、Freso 等是常用的图片加载库,在这三者中,Picasso 的优势是小,不到120K,以下是常用 api :Picasso 源码地址为:/square/picasso
图片框架的用例一个图片框架,一般都会包含缓存、图片下载、图片处理(压缩、解码、变换、加载、显示)、统计等四大模块,Picasso 也不例外。
如何阅读 Picasso 源码
Picasso 对图片开始请求加载到显示的每个阶段均做了完整的日志记录,以官方 Demo 为例,启动日志开关后,打开图片详情页:由于此时为该图片的第一次加载,因此涉及到图片的下载、缓存和显示等不同阶段,日志如下:日志中反应了三个不同的角色,及他们所负责的任务:
Main:主线程,负责发起图片加载的请求,最终完成加载。
Dispatcher:分发器,负责将图片加载的请求入队、打包、分发。
Hunter:工作线程,负责图片的下载、解码、转换。
第一次加载时,没有任何内存和磁盘缓存,第二次加载时,主线程直接从缓存中读取图片即可,日志如下:跟随日志阅读 Picaasso 源码,方可事半功倍。
Picasso:门面类,提供 Picaaso 单例的创建,预置了默认的现线程池、内存缓存和磁盘缓存策略。
Request:封装了图片加载请求的信息,如图片的Uri、Resource ID、宽高、scaleType 等。
RequestCreator:用于创建 Request 对象。
RequestHandler
图片加载请求的处理器,定义了不同类型来源的文件请求如何处理,最终将返回 Source 类型,可以理解为文件字节流。
图片来源类型包括:Assets 资源、SD 卡图片、网络图片、联系人照片、其他内容服务提供者、多媒体资源等。因此该抽象类有多个具体的子类。
这些子类将以集合的形式,存在于 Picasso 单例中,当 Request 符合 RequestHandler 的处理规则时,便以该 Hander 进行处理。
返回的字节流将经过一系列的解码、变换后,变成最终的 Bitmap 对象。
Dispatcher:分发器,负责分发和处理图片加载的不同阶段,如提交(入队)、取消、暂停、继续、完成、重试、网络状态变化等,并内置了 HandlerThread 来处理大部分无需主线程处理的任务,有了分发器的存在,代码结构更清晰。
BitmapHunter:图片处理的工作线程,图片的下载、解码、变换等耗时任务均在该线程中执行。
Action:如果 RequestHandler 是图片加载的开始阶段,Action 则是结束阶段,Action 是抽象类,他决定了图片的最后一个环节:如何将图片渲染在目标容器中(如 ImageView 和 RemoteViews 等),由于目标容器有多种情况,因此也有多个子类。
Download:图片下载器,内置了实现类 OkHttp3Downloader 和磁盘缓存策略,可自定义实现类进行扩展。
PicassoExecutorService:内置的线程池,容量定义策略见下文分析。
Cache:内存缓存接口,内置了缓存策略实现类 LruCache,可自定义实现类进行扩展。
Transformation:图像的变换接口,如果需要对图片进行范围裁切或几何变换均可实现该接口进行自定义,也可参考 picasso-transformations 。
Stats:统计图片加载过程中的数据,如缓存命中数、命中率、图片下载大小,经过变换的图片大小等信息。
线程和线程池
Picasso 中的主要线程有四类,分别是:
负责下载、解码、转换图片的工作线程——BitmapHunter,这类线程由线程池 PicassoExecutorService 进行统一调度。
负责分发图片在加载过程中的不同阶段的行为指令(如 submit、cancel、pause、resume、retry 等)——Dispatcher.dispatcherThread,其类型为 HandlerThread。
负责统计(如缓存命中数、命中率、缓存大小等)的线程——Stats.statsThread,其类型为 HandlerThread。
负责加载图片的线程——主线程。
这是一个 HandlerThread 的典型应用场景,主线程仅负责跟 UI 相关的工作,其他无关的工作均在工作线程或 HandlerThread 中进行处理,如线程之间需要通讯,则通过相应的 Handler 进行通讯,大大减轻了主线程的负担。
Picasso 中的线程池大小会根据网络状态而改变,其规则是 Wifi 状态下,线程池个数为4,4G/3G/2G 状态下分别为3/2/1,这种定义线程池大小的策略可以作为我们有类似应用场景的参考。
内存和磁盘缓存策略及实现是图片框架必不可少的部分。Picasso 中的两级缓存都采用了 LRU 的缓存策略。
LruCache 为 Picasso 中的缓存实现,该类的主要实现与 Android 默认提供的基本一致,区别有两点:
前者重载了构造器,定制了缓存大小的计算,其计算逻辑为:应用所分配内存的 15% ,源码在 Utils.calculateMemoryCacheSize(context) 中,缓存大小的申请比例也可以作为有类似应用场景时的参考。
抽象出接口 Cache,面向接口编程,如此一来,只要开发者提供实现类,便可扩展缓存策略。
当加载网络图片时,我们往往会将图片下载下来,缓存在磁盘中,因此会涉及到磁盘缓存。Picasso 内置了图片下载器 OkHttp3Downloader,本质上是使用自家的 OkHttp 进行图片下载,并内置了缓存策略 DiskLruCache,默认可缓存的文件大小总数为 50M 。值得一提的是,DiskLruCache 也是由 JakeWharton 提供的。
如果需要更换图片下载器和磁盘缓存策略,则可以自定义 Downloader 的实现类进行扩展。
以上所述的线程池、缓存策略等均是面向接口编程,因此都可以扩展,扩展的套路便是在 Picasso.Builder 中设置属性,这种建造者模式的写法我们见惯不怪,源码中的方法声明如下:值得注意的细节
Picasso 的所有代码均在一个 package 中,其好处是可以将大部分类和方法的访问权限均设置 default 的,对外隐藏,对内暴露,缺点则是代码分类略显杂乱,但相比优点和其代码量小的特点来说,缺点不值一提。
负责图片加载的 Action 持有 Target(一般是ImageView)的 WeakReference,当图片加载的生命周期更长时,确保 Target 能被回收而不会造成内存泄露。
简洁而风格统一的日志设计。Picasso.setLoggingEnabled(true) 的方法可以启动日志打印,上文提到的日志反映出的图片加载的不同阶段均是在工具类 Utils中定义的,如下图:
图片来源指示器。在开发阶段,我们可以通过Picasso.setIndicatorsEnabled(true)启动图片指示器,标识图片的来源,这是对开发者非常友好的设计:使用 ContentProvider 提供 Context对象供 Picasso 单例使用,此版本尚未发布,从 master 中可以看到此代码:相应的,Picasso.with() 不需要再传入 Context 对象:这小技巧可以扩展我们提供 api 的思路,如果不需要特定的 Context,则可以通过 ContentProvider 来提供,方便使用。
该库的单元测试行覆盖率也高达 72% 。
4总结 目前而言,虽然 Picasso 并非最主流的图片加载框架,但由于其体型娇小能量巨大,更容易入手阅读,通过它,我们可以了解图片框架的用例、实现套路、缓存策略的思路、复杂线程的处理等,也是非常值得一读的开源库。
http://blog.csdn.net/chdjj/article/details//android-cn/android-open-project-analysis/blob/master/tool-lib/image-cache/picasso/README.md
关注公众号「码个蛋」 Android技术、职场精进、在这都有,周一至周五早上7点准时推送。为您提供最快捷的精进之路。系列文章
我要该,理由是:
关闭理由:
删除理由:
忽略理由:
推广(招聘、广告、SEO 等)方面的内容
与已有问题重复(请编辑该提问指向已有相同问题)
答非所问,不符合答题要求
宜作评论而非答案
带有人身攻击、辱骂、仇恨等违反条款的内容
无法获得确切结果的问题
非开发直接相关的问题
非技术提问的讨论型问题
其他原因(请补充说明)如何看待Jake Wharton 从Square离职? - 知乎219被浏览12621分享邀请回答39添加评论分享收藏感谢收起2017安卓开发资料大全
博客和教程Android Developers Blog谷歌官方的安卓开发者博客。这里可以找到最新的资讯、技巧和开发示例。该博客的所有内容都值得查看。Official Android Blog谷歌安卓官方的博客,这里主要是面向用户的。介绍了新的功能、新的资讯等内容。作为开发者也可以通过这里来了解安卓系统进化的第一手资料。Android Developers官方的安卓开发文档,保护 API 文档、SDK、教程、示例 等一切关于安卓开发的内容。里面还有针对其他开发者的采访,可以了解其它开发者是如何开发出成果的应用的。Vogella安卓开发金矿。里面包含了很多详细的教程和相关的资料。Vogella 提供了关于安卓开发的咨询和培训服务。Romain GuyRomain Guy 是安卓系统的一位工程师。他的个人博客中有很多优秀的关于安卓开发相关的内容。 Romain Guy 还热衷于摄影,这里是他的 Flickr 和 500px 主页。Android Weekly顾名思义,这是一个关于安卓开发资讯的周报。每周都汇集了主要的安卓开发博客、教程、视频、播客 等内容。 推荐订阅该网站。Cyril MottierCyril Mottier 是一个移动产品设计和开发人员,同时还是谷歌安卓专家。他喜欢打造极致的安卓应用,创造极致的用户体验。他的个人博客有很多相关的开发资料。Envato Tuts+Envato Tuts+ 创建了很多安卓开发教程和课程,来帮助开发者提高开发技能,逐步从新手到专家。里面包含了上千个关于安卓开发相关的教程。Ongoing by Tim BrayTim Bray 在谷歌工作过。他在 2003 年开始写博客,博客中有很多关于技术、商业的文档。Android Niceties这是个安卓设计师喜欢的地方。收集了很多漂亮的安卓应用设计图。该博客致力于提供安卓 UI 相关的内容,让设计师在这里找到灵感。Codementor (Android)里面的内容对于安卓初学者来说很不错。里面包含大量安卓初级开发教程,帮助您学习如何开发安卓应用,同事 Codementor 还提供安卓专家来帮助您更高效的学习安卓开发。Android UI Patterns由安卓爱好者 Juhani Lehtim?ki 创办,他还是 Fat Robot 的CTO。该网站的目标是,记录他们按照安卓 UI 模式来开发应用的设计以及如何演化这种设计模式。同时还介绍了好的设计模式和坏的设计模式。Android Central和安卓相关的一切资讯内容。普通的安卓消费者比较关注这个网站,里面包含了相关的新闻报道和安卓系统相关的开发内容。现在他们来报道和谷歌相关的内容,有点像中国的谷奥网站。ComputerWorld Android Intelligence这个是由资深记者 JR Raphael 的一系列和安卓相关的报道。从不同角度看待安卓。Jake WhartonSquare 的工程师,在安卓领域有很多优秀的开源项目。 他的 Github 主页值得关注。Styling AndroidMark Allison 创办的网站, Mark Allison 有 30 年开发经验,4 年安卓开发经验。 在该网站有很多和安卓相关的技术文章。Dan Lew CodesTrello 公司的安卓开发工程师 Dan Lew 的网站。里面有一些关于安卓开发的技术文章值得参考。The CommonsBlogMark Murphy 创建了 CommonsWare ,还是 The Busy Coder’s Guide to Android Development 一书的作者。无论是初学者还是富有经验的安卓开发者,该博客都可以帮助你提高安卓开发的技能。Codedependent谷歌工程师 Chet Haase 的博客,关注安卓绘图和动画相关的内容。从 2008年开始在其博客上发表技术相关的文章。他还和 Romain Guy 一起写了一本 Java 绘图的书: Filthy Rich ClientsCodePath Android Cliffnotes也是一个适合所有级别的安卓开发者的网站。该网站通过主题来分类教程,所有很容易发现您感兴趣的主题内容。并且该网站还接收投稿,在投稿前请先查看他们的投稿指南。Diego Torres Milano’s blogDiego Torres Milano 是安卓系统工程师,linux 拥护者,Android Application Testing Guide一书的作者。还是 CulebraTester 和AndroidViewClient 的创建者。从 2006 开始在博客分享代码和测试相关的文章。Android Arsenal安卓开发者武器库,里面包含开发工具、第三方库和开源的应用。如果您也开发由开源库,可以联系他们收录您的库。Android UI UX由 Google Developer Expert (GDE) Taylor Ling 创建的关注安卓 UI、UX 的设计网站。里面有很多最新最流行的设计方案。Grokking AndroidWolfram Rittmeyer 的博客,他是一个安卓工程师,在博客上写了很多和安卓开发相关的文章。Pushing Pixels非常棒的安卓设计博客,由 谷歌员工 Kirill Grouchnikov 创建,这家伙还同时是个工程师,开发了很多安卓工具和开源库。Java PapersJoseph Kulandai 的博客,里面有很多关于 Java、安卓、设计模式、Web service 等的文章和教程。Joseph 是资深的 Java 和 安卓开发者。如果有时间,他还可以提供外包帮助您开发安卓应用。Chris Banes谷歌安卓 Developer Programs Engineer (DPE) 团队成员。他的个人博客中也有一些关于安卓开发的内容。Android Design Patterns设计模式爱好者 Alex Lockwood 的博客,里面有很多安卓相关的开发文章。里面的很多文章就是解决具体安卓开发过程中的各种问题和提出各种解决方案。值得一看。TechnoTalkativeParesh Mayani 的博客,从安卓 1.5 就开始关注安卓开发了,其博客上有一个 Lazy Android Developers: Be productive 系列教程很有趣。Antoine MerleAntoine Merle 的个人博客,其本人为 Deezer 的工程师。偶尔发布一些开发相关的文章。ONGOING DEVGabriele Mariotti 的博客,分享一些安卓开发中的小技巧。博主有15年的工作经验,博客主要发布一些安卓开发相关的内容。Grafix ArtistSuleiman Ali Shakir 是一个设计师、开发者和艺术家。 他所创建的应用,UI和交互都是非常棒的。他的博客主要关注重新设计UI来改进交互的文章,还有一些开发中的小技巧。NewCircle Developer StreamStream 持续的更新一些开源的开发教程。其中很有多关于安卓开发的。 NewCircle 是一家提供软件开发培训的公司。Egor Andreevici一位很有激情的安卓工程师的个人博客。目前在 1&1 Mail & Media Development & Technology GmbH 工作。<这里有关于最新的安卓开发工具的介绍,还有可以创建很棒用户体验、高性能安卓应用的编程技术资料,以及一些帮助你把应用发布到市场的各种建议。Android & Tech由 Jan-Lk Else 创办,里面的内容包含安卓、技术、应用开发和应用的各种奇技淫巧。里面的文章也有多位工程师投稿。Chris ArriolaChris 是一个开发安卓和 iOS 应用的自由职业者。致力于创建漂亮的应用并推广到全球用户使用。他的博客上面有很多关于界面和代码的示例。Android Libraries (GitHub)主要有 Daichi Furiya (一个安卓领域的Google Developer Expert)维护的一个按照字母排序的安卓开发第三方类库。Amit ShekharAmit 是 Bobble 的安卓开发主力。同时还是 Free Code Camp 的技术作者。论坛和问答网站Google Groups: Android Developers安卓开发的谷歌讨论组,在安卓开发的过程中遇到的任何问题都可以在这里讨论。Stack Overflow没啥可说的,没上过这个网站的人只有两种:真正的大牛和真正的小白。GitHub同样不必介绍了,没听说过 GitHub 说明您也不是真正想学习是如何写代码的。QuoraQuora 是另外一个流行的问答网站。RedditReddit是个社交新闻站点,口号:提前于新闻发生,来自互联网的声音。里面关于安卓开发者(频道:AndroidDev )资讯的讨论还是很多的。XDA Forums地球上最大的安卓社区。不管是用户、还是开发者以及黑客在这里都能找到自己需要的内容。Bytes是一个开发者和 IT 专家社区。可以和其他40多万全球专家一起讨论和软件开发、网络、安全、web开发、移动开发、数据库等相关的问题。CodeGuru ForumsCodeGuru 是开发者用来分享新想法、文章、提问、回他其他人提问以及收集何种奇技淫巧的地方。这里有很多发生在真实世界真实项目上的具体问题以及解决方案。Codecall Forum另外一个开发者来分享新想法、文章的地方。AndroidAuthority Forums是一个和地球上其他安卓爱好者一起交流的地方。在这里可以得到其他专家以及其他设备所有者的帮助。AndroidForums学习如何开发安卓应用和游戏的论坛。可以发布示例点、咨询问题并分享您的观点。视频教程Android Developers Channel订阅数量:379,493来自于官方的安卓开发者视频频道,包含重大活动的现场直播。里面的内容从示例、教程、新功能介绍 到其他一切和安卓开发相关的内容。Thenewboston – Android App Development for Beginners订阅数量: 1,326,882面向于初学者,这里初学者可以学习到关于如何开发安卓应用的一切内容,包含如何使用 SDK 和 Android studio。Derek Banas – How to Make Android Apps订阅数量:493,852学习如何开发安卓应用和实现相关功能,其作者会更加读者的请求来制作相关的视频教程。XDA Developers – How to Build an Android App Series订阅数量:391,386来自于 XDA 的系列安卓开发教程。里面介绍了一些安卓开发过程中非常酷的内容。Android Bootcamp Training订阅数量:112,167如何设计和开发安卓应用的手把手教程。解释了安卓应用开发过程中的开发理念。Udacity – Developing Android Apps订阅数量:110,131比较流行的编程教学网站推出的频道。Android Development For Absolute Beginners订阅数量:102,562适合初学者观看。Hooman Mardokhi – Become An Android Developer订阅数量:9,025科学爱好者 Hooman 分享他自己在商业、技术和应用开发过程中的心得。MultiAndroid zone Advanced Tutorial订阅数量:7,126MultiAndroid 用来把安卓开发者和 iOS开发者聚集起来,让他们可以相互学习。Mobile Development III: Advanced Android订阅数量:6,943是教师 Dave Jones 的教学视频。TutorialBaba – Android Studio App Dev Tutorials订阅数量:5,496TutorialBaba 是一个教学频道。里面包含各种领域的教学视频,例如 Android, HTML, CSS, JavaScript, Bootstrap, Android Studio, Git, GitHub 等。播客Fragmented Podcasts由安卓开发者 Donn Felker 和 Kaushik Gopal 主办的播客。会邀请知名人物来讨论各种工具、第三方库的内容。Android Developers Backstage是谷歌公共关系团队成员 共同主持的一个播客。讨论如何创建更好的应用以及其他安卓相关的内容。每期会邀请一些安卓开发团队的人员和其他知名开发者来一起讨论一个主题。Android Central Podcast提供每周资讯、评审和其他和安卓新设备相关的内容。Code Newbie PodcastCodeNewbie 是一个开发者社区。其博客由很多其他开发者学习编程的心路历程。每周一会发布新的内容。XDA Developers’s PodcastXDA Developer 团队出品。内容涵盖最新的安卓新闻、新的 Nexus 手机、即将发布的移动设备及其其他安卓信息。Google+ 社区Android Development268,880个安卓开发者聚集这里讨论各种开发问题、分享最新的开发文章和各种奇技淫巧。Android Central1,990,228个成员。有专业的 Android Central 主办的一个社区。Android966,281 个成员,每个安卓用户都可以在这里获取帮助。XDA-Developers180,90 个成员。 非官方的 XDA 论坛开发者聚集地。Android Authority172,063 个成员。专注于 安卓 的社区。Android Developer Tools108,395 个成员。安卓开发工具官方社区,讨论各种开发工具:Android Studio、SDK、ADT、Gradle 、模拟器等。Android Apps77,762 个成员。专注于安卓应用的社区。这里可以分享您发下的好玩的应用。Android Themes73,785 个成员。一个专注于讨论安卓主题相关的社区。Android Games43,632 个成员。没有好玩的游戏了?来这里看看吧。这里可以发现各种最新的好玩的酷游戏。Android Studio37,629 个成员。Android Studio 的官方社区。学习如何使用 Android Studio 来编写最棒的安卓应用。Facebook 群组Android Developer成员数量:76,954。Nob Paka 创建的,用来分享安卓相关的文章和咨询相关相关的问题。特别是关于如何写代码的。Android Custom ROM’s & Developments成员数量:53,638。分享和 ROM 相关的一切内容。Android Developers成员数量:28,047。安卓开发者群组。这里可以讨论各种创意来提高在安卓开发领域的技能。Android Developers International成员数量:23,648。地球上所有安卓开发者群组。Android Developers Vietnam成员数量:24,132。越南开发者群组,越南开发者还真不少啊。Android Developers Bangladesh成员数量:20,251。孟加拉国开发者群组。Android Developer Indonesia成员数量:13,986。Thailand Android Developer成员数量:12,698。Android Developer Taiwan成员数量:6,323。Android Developers Israel成员数量:3,115CodeAndroid SingaporeFrom: AnySoftwareTools
(来源:,如对本网转载内容、版权有异议,请联系我们: )
安卓网官方微信
微信号 Hiapk2013
这里有最无节操的小编和最鲜辣的资讯!
手机扫描二维码访问

我要回帖

更多关于 程序员如何看待离职 的文章

 

随机推荐