【建议收藏】Android 中高级大厂面试源码秘籍 (1),android 开发实战湖南师范大学出版社
@TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR1)private static void assertNotDestroyed(Activity activity) {if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1 && activity.isDestroyed()) {throw new IllegalArgumentException("You cannot start a load for a destroyed activity");}}
这里我们可以看出 You cannot start a load for a destroyed activity 这句话就是从这里向 IllegalArgumentException()中作为参数传入,并且抛出了这个异常。在看这段代码,有个判断,一个是版本号大于 J,并且 activity.isDestroyed()都为真时,才抛出这个异常。版本号现在基本都是大于 J 了,而当我们 activity 销毁后,Glide 还在工作,这时就抛出了这个异常了。相当于我主线程都销毁了,你 Glide 特么还工作个毛线?加载个数据谁要?因此程序不干了,给你报错吧。这里说明 Glide 写的真心不错的。这里抛出的这个异常信息还是非常明确的。下面来看看怎么处理:
if (Util.isOnMainThread()){Glide.with(getApplicationContext()).load(url).into(view);}......@Overrideprotected void onDestroy() {super.onDestroy();if (Util.isOnMainThread()){
Glide.with(this).pauseRequest();}}
在 onDestory()中加入了判断,如果 Activity 销毁的话,那么 Glide 停止工作啦。老板都走了你加班给谁看呢???从这个例子可以看出,log 日志中除了我们自己写的类注意观察一下外,前两行日志还是非常重要的。
(三)提升编程能力读一本好书,就是和许多高尚的人谈话。-歌德
和阅读一本好书一样,阅读源码就是和编程大牛面对面交流的机会,在许多优秀的开源项目中,它们的编码规范和架构设计都是很棒的,另外在设计上也使用了大量的设计模式,通过阅读和学习源码,能够快速提升我们的编码水平,以及对设计模式有更深的理解。
同时,在我们阅读完一个源码后,可以触类旁通,能够快速地对其他框架的源码进行阅读和学习,减少时间成本。
除了上述提到的原因之外,可能还有许多,在这里就不一一赘述了,那么在确定了要阅读源码之后,就让我们看下如何阅读源码吧!
如何阅读源码?
1.深入解析微信 MMKV 源码[MMKV](
)?是微信于 2018 年 9 月 20 日开源的一个 K-V 存储库,它与 SharedPreferences 相似,但又在更高的效率下解决了其不支持跨进程读写等弊端。
2.深入解析阿里巴巴路由框架 ARouter 源码组件化被越来越多的 Android 项目采用,而作为组件化的基础——路由也是重中之重。因此详细的分析阿里巴巴开源的路由框架 ARouter。从源码的角度解释为什么这样使用,以及避免做什么,让你使用地更加顺滑。
3.深入解析 AsyncTask 源码(一款 Android 内置的异步任务执行库)AsyncTask?是 Android SDK 中提供的一个用于执行异步任务的框架,在 Android 兴起的早期被广泛使用,但如今已经被 RxJava、协程等新兴框架所取代。虽然它存在着一些不足,但我们还是可以尝试了解一下它的实现原理以及存在的不足。
4.深入解析 Volley 源码(一款 Google 推出的网络请求框架)Volley 是 Google 开发的一款网络请求框架,目前已停止更新。虽然目前大家的关注焦点都在 Retrofit、OkHttp 等第三方网络请求框架,团队的项目中所用的也是这两个框架,但 Volley 中还是有非常多优秀的设计思想值得我们去学习的。
5.深入解析 Retrofit 源码在 Andrroid 开发中,网络请求十分常用,而在 Android 网络请求库中,Retrofit 是当下最热的一个网络请求库。
6.深入解析 OkHttp 源码 OkHttp 是一个处理网络请求的开源项目,是 Android 端最火热的轻量级框架,由移动支付 Square 公司贡献用于替代 HttpUrlConnection 和 Apache HttpClient。随着 OkHttp 的不断成熟,越来越多的 Android 开发者使用 OkHttp 作为网络框架。
7.深入解析[](
)ButterKnife 源码作为 Android 开发者,大家肯定都知道大名鼎鼎的 butterknife。它大大的提高了开发效率,虽然在很早之前大家就开始使用它了,但是只知道是通过注解的方式实现的,却一直没有仔细的学习下大牛的代码。所以有必要系统的分析下 butterknife 的实现原理。
8.深入解析 Okio 源码(一套简洁高效的 I/O 库)Okio 中有两个非常重要的接口——Sink?以及?Source,它们都继承了?Closeable,其中?Sink?对应了我们原来所使用的?OutputStream,而?Source?则对应了我们原来所使用的?InputStream。Okio 的入口就是 Okio?类,它是一个工厂类,可以通过它内部的一些 static
方法来创建?Sink、Source?等对象。
9.深入解析 SharedPreferences 源码 SharedPreference 是一个 Android 开发自带的适合保存轻量级数据的 K-V 存储库,它使用了 XML 的方式来存储数据,比如我就经常用它保存一些如用户登录信息等轻量级数据。
10.深入解析 EventBus 源码 EventBus 是一个 Android 事件发布/订阅框架。传统的事件传递方式包括:Handler(消息处理机制,一般用于更新 UI)、BroadCastReceiver(广播接收者)、Interface 回调。
EventBus 优点:
Activity、Fragment、Service 与线程之间的通讯是很常见的,EventBus 正好可以屏蔽一些线程切换问题,简单地实现发布订阅功能。
代码简洁,使用简单,并将事件发布和订阅充分解耦。
11.Android 自定义注解初探由于之前用到的很多开源框架如 GreenDao、EventBus、ButterKnife、ARouter 等都使用了自定义注解,因此有必要去研究一下自定义注解。
12.View 的工作机制源码分析
13.[](
)Android 触摸事件分发机制源码分析
14.[](
)Android 按键事件分发机制源码分析
15.深入解析?Handler 源码 Android 的消息机制是基于 Handler 实现的。很多人以为,知道了 Handler、Looper、MessageQueue 就自以为了解了 Handler 的原理。但其实看源码的过程中慢慢就会发现,Handler 的内容可不止这点, 像同步屏障、 Handler 的 native 层的阻塞唤醒机制等等这些知识以前就没有理解清楚。
16.深入解析 Binder 源码 Binder 在 Android 中堪称武林秘籍中的"易筋经",无论是菜鸟还是老鸟都对之神往。Binder 架构是进程间相互通信的最常用手段,四大组件的基本功能都是依赖着 Binder 才能够实现的。为了开发者能够使用 java 与 cpp 进行 binder 通信,binder 的设计贯穿了 framework、native 和 kernel 层,开发者可以轻松的在上层使用 binder 向其它进程发起数据通信。
17.深入解析 JNI 源码 Android NDK 开发中,常常因为效率、安全等原因,需要借助 JNI 的机制调用到 Native 环境中进行 c/cpp 操作。
评论