
读书笔记
文章平均质量分 72
月亮是我踹弯的
抱怨没有用,一切靠自己
展开
-
Android中的ANR
1.系统是如何设计ANR的,都有哪些组件或者服务会发生ANR?ANR全程Application No Response,Android设计ANR的用意,是为了在系统与zujian原创 2021-07-01 09:39:48 · 387 阅读 · 2 评论 -
滥用SharedPreference导致ANR
Google在设计之初为了方便开发者,实现了一套轻量级的数据持久化方案---SharedPreference,因为其简便的API,得到了开发者的青睐,对其依赖也越来越严重。随着版本迭代可以发现,越是重量级的应用,出现ANR的问题越来越严重。SP导致ANR原因分析问题一:sp文件创建后,会单独使用一个线程来加载解析对应的sp文件,但是当UI线程尝试访问sp中内容时,如果sp文件还未被完全加载解析到内存,此时UI线程会被block,直到sp文件被完全加载到内存中为止。具体ANR的情况如下:主原创 2021-05-24 11:31:48 · 757 阅读 · 1 评论 -
读《Head First 设计模式》记录
第一章设计原则:找出应用中可能需要变化之处,把他们独立出来,不要和那些不需要变化的代码混在一起。 针对接口编程,而不是针对实现编程,针对接口编程真正的意思是“针对超类型”编程。...原创 2020-12-30 09:45:27 · 134 阅读 · 0 评论 -
重学数据结构与算法(面试现场)
20 | 代码之外,技术面试应该具备哪些软素质技术面试一般涉及以下6个环节:简历筛查好的简历要满足以下3个必要条件,分别是信息完备、抽象概括、重点突出。信息完备,指的是必备的东西不可缺。例如姓名、学历、联系方式、工作经历等。 抽象概括,指的是可有可无的东西不要写。例如,政治面貌、户籍等。 重点突出,指的是对你有利的东西要放大放粗。例如,电话、S绩效、系统性能提高50%等。自我介绍建议控制在5分钟,按照时间顺序,比如从大学开始分段介绍,高度抽象出来,以10句左右为限制。说的时候语原创 2020-09-25 15:01:40 · 255 阅读 · 0 评论 -
经典排序算法原理与优劣对比
二分查找要求原数组必须有序。其实,由有序到无序,这是算法领域最常见的一类问题。本课时主要学习4种常见的排序算法,包括冒泡排序、插入排序、归并排序以及快速排序。衡量一个排序算法的优劣,我们主要从以下3个角度进行分析:时间复杂度,具体包括,最好时间复杂度、最坏时间复杂度以及平均时间复杂度。 空间复杂度,如果空间复杂度为1,也叫作原地排序。 稳定性,排序的稳定性是指相等的数据对象,在排序之后,顺序是否能保证不变。常见的排序算法及其思想1.冒泡排序原理:从第一个数据开始,依次比较相...原创 2020-09-24 17:18:44 · 240 阅读 · 0 评论 -
持续学习--Android性能优化
2020.9.21 性能优化之运用设计模式优化代码结构 好的设计模式可以增强代码的可阅读性、易维护性、可扩展性。例如门面模式,我们在使用某个三方库(比如网络库)之前,可以先创建一个门面类,这个门面类是使用该三方库的唯一入口,这样就降低了业务逻辑和三方库的耦合度,一旦我们想更换三方库,只需要在门面类中修改即可。 然后在门面类中修改却不符合设计模式的开闭原则,什么是开闭原则呢,简单的讲就是,对修改关闭,对扩展开放。延续上面的例子,比如我们有一个VolleyFacade门面类,现在要将...原创 2020-09-22 11:17:47 · 193 阅读 · 0 评论 -
Android进阶课学习收获(27~28)
第27讲:面对UI卡顿,如何入手分析解决问题? 对于UI性能分析,Systrace是目前使用最广的工具。它能够帮助开发者分析多个模块的运行状态以及详细信息。比如SurfaceFlinger、View刷机机制等。通过Android提供的脚本systrace.py,可以设置数据采集方式并收集相关程序运行数据,最终生成一个网页文件,提供程序开发者分析程序性能问题。Systrace简单使用在Android SDK中提供了运行Systrace的脚本,具体路径在 android-sdk/plat...原创 2020-09-23 16:55:59 · 335 阅读 · 0 评论 -
持续学习--PMS服务启动原理、AMS服务执行流程详解
1.PMS服务启动原理?从开机到APP启动,PMS服务处理机制及流程?PMS全称Package Manager Service,由System Server启动,PMS运行在单独的系统进程中,启动的时候通过ServerManager.addService()存入PMS对象,应用层通过ServerManager.getService()获取对象,由于PMS运行在单独的进程中,所有其获取的对象是一个IBinder接口。 PMS的作用时期主要集中在手机开机时期,它会扫描/data/system和/data/原创 2020-08-25 13:49:18 · 1395 阅读 · 0 评论 -
正确的认知自我和世界
认知是一件非常重要的是事情,俗话说,“人贵有自知之明”,一个人只有对自己有正确的认识,才能对标世界,找准自己的位置。 对事物只凭片面的了解或局部的经验,就乱加猜测,做出判断,这种做法是非常可怕的。如果用于做商业判断,就很容易将企业推向深渊。 要想更好地认识世界,获得最详实、最可靠、最接地气的一手信息,还需要与大量的市场参与者交流,从他们口中获得真实的信息,这是最基本的认知态度。在交流的过程当中尽可能少的表达自己的观点,多去有意识地锻炼自己的提问能力。 因为每...原创 2020-08-11 12:09:10 · 1399 阅读 · 0 评论 -
Android进阶学习收获(1~6节)
第一节《程序运行时,内存到底是如何分配的》 Java虚拟机在执行Java程序时,会把他管理的内存区域划分为不同的数据区域,下面这张图描述了一个HelloWorld.java文件被JVM加载到内存的过程:HelloWorld.java文件首先经过编译器编译,生成HelloWorld.class 字节码文件。 当Java程序访问这个类时,需要通过ClassLoader将HelloWorld.class字节码文件加载到JVM的内存中。 JVM的内存可以划分为若干个不同的数据区域,主要分为:程序计..原创 2020-05-25 10:51:17 · 363 阅读 · 0 评论 -
Android进阶学习收获(7~12节)
第07节:Java内存模型与线程 Java内存模型(Java Memory Model)简称JMM,它所描述的是多线程并发、CPU缓存等方面的内容。在每个线程中,都会有一块内部的工作内存,这块工作内存保存了主内存共享数据的拷贝副本。我们在第一节课中,了解到JVM内存结构中有一块线程独立共享的内存空间----虚拟机栈,所以这里我们会自然而然的将线程工作内存理解为虚拟机栈。实际上这种理解是不正确的,虚拟机栈和线程的工作内存并不是一个概念,在Java线程中并不存在所谓的工作内存,它只是对CPU寄存...原创 2020-07-03 16:31:19 · 254 阅读 · 0 评论 -
Android进阶课学习收获 (13~18)
第13讲:Android是如何通过Activity进行交互的?taskAffinity 单纯使用taskAffinity不能导致Activity被创建在新的任务栈中,需要配合使用singleTask或者singleInstance。我们可以在命令行里输入 adb shell dumpsys activity activities 来输出日志 查看任务栈情况,其中一个TaskRecord代表一个任务栈,如下:taskAffinity + allowTaskReparenting...原创 2020-08-28 18:47:58 · 473 阅读 · 0 评论 -
Android进阶课学习收获 (19~22)
第19讲:startActivity启动过程分析 在手机桌面上点击某一个icon后,实际上最终就是通过startActivity去打开某一个Activity页面,在startActivity操作中还需要判断目标Activity的进程是否已经创建,如果没有,则在显示Activity之前还需要将进程Process提前创建出来。假设ActivityA跳转到另一个APP中的ActivityB,整个startActivity的流程分为3大部分,也涉及3个进程之间的交互:ActivityA -->..原创 2020-09-10 19:04:50 · 377 阅读 · 0 评论 -
Android进阶课学习(24-26)
第24讲:APK如何做到包体积优化?因为每个项目的背景、实现方式都不尽相同,导致各个项目之间能列出的共性相对较少。本节主要从两部分谈谈对包体积优化的一些尝试:安装包监控、安装包大小优化。安装包监控Android Studio 的APK Analyser analyser的使用非常简单,只需将需要分析的apk文件拖入Android Studio即可,它会显示各项内容所占的大小,并按照大小排序,比如图片占用了比较大的资源空间,可以针对其做压缩优化等操作。Matrix 的ApkCh...原创 2020-09-16 11:48:19 · 352 阅读 · 0 评论 -
Android进阶课学习收获(29~30)
第29讲:MVP中presenter生命周期管理 我们经常在Android MVP架构中的Presenter层做一些耗时操作,比如请求网络数据等。然后根据请求后的结果刷新View。但是如果按返回结束Activity,而Presenter仍然在执行耗时操作,那么就有可能造成内存泄漏,严重时甚至会造成程序崩溃,因为Presenter中的View已经变为null。为了解决这个问题,我们需要将Activity的某些生命周期方法与Presenter保持一致。Lifecycle绑定Presente...原创 2020-09-22 08:53:12 · 212 阅读 · 0 评论 -
Android进阶课学习收获(31~33)
第32讲:解析动态权限适配遇到的问题 Android 6.0之前,APP需要的权限会在安装阶段向用户展示,APP运行期间不需要动态判断权限是否已申请。从6.0之后的版本开始,对于部分权限,APP需要在代码中动态申请相应的权限。 Android权限分2种,分为普通权限和危险权限,这两种权限都需要在AndroidManifest清单文件中声明。普通权限在程序运行期间自动获取,危险权限比如通讯录、图库、位置等这类操作,Android系统要求App主动向用户展示操作所需要的权限,只有用户...原创 2020-09-17 14:45:33 · 696 阅读 · 0 评论 -
读《刻意练习》收获
天才是训练的产物,他们进行大量正确、有效的训练。原创 2020-05-08 13:49:41 · 290 阅读 · 0 评论 -
Android高手课---崩溃捕获
1.Android中的崩溃有两种,Java崩溃和Native崩溃。Java崩溃就是在Java代码中,出现了未捕获异常,导致程序异常退出;Native崩溃一般都是因为在Native代码中访问非法地址,也可能是地址对齐出现问题,或者发生了程序主动abort,这些都会产生相应的signal信号,导致程序异常退出。2.崩溃就是程序出现异常,而一个产品的崩溃率,跟我们如何捕获、处理这些异常有比较大的关系...原创 2020-02-25 20:37:18 · 1007 阅读 · 0 评论 -
JAVA并发编程的艺术 -- 收获
《第一章:并发编程的挑战》2019.9.91.如果通过多线程执行任务来让程序运行的很快会遇到很多问题,比如上线文切换、死锁、以及受限于软硬件的资源限制问题。2.单核处理器也支持多线程的执行代码,CPU通过给每个线程分配时间片来实现,因为时间片比较短(一般几十毫秒),所以CPU通过不断地切换线程,让我们感觉多个线程同时执行。3.CPU在切换前,会保存上一个任务的状态,以便下次切回这个...原创 2019-09-12 14:09:11 · 213 阅读 · 0 评论