
学习
文章平均质量分 66
月亮是我踹弯的
抱怨没有用,一切靠自己
展开
-
读《见识》
读书收获原创 2022-07-10 18:27:53 · 217 阅读 · 1 评论 -
Android卡顿优化
我们知道,当APP进程的UI Thread和Render Thread在接到VSync信号后,绘制一帧所花的时间超过16.6ms,APP就会发生掉帧,实际上,在画面显示时,不仅仅和当前帧的数据有关,还跟相邻帧的步长有关系,如果相邻的步长没有规定到一个固定的范围内,用户也会感觉到明显的卡顿而Systrace看不出来。工欲善其事必先利其器,分析掉帧我一般通过以下几种方式分析卡顿。SysTrace使用1.首先要装Python 2.x的版本,SysTrace脚本不支持Python 3.x版本2.cd原创 2021-11-03 15:33:08 · 1433 阅读 · 2 评论 -
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 评论 -
重学数据结构与算法(15~19)
15 | 定位问题才能更好地解决问题:开发前的复杂度分析与技术选型我们前面学习的数据结构和算法思维,是解决问题和代码优化的基础。本节课开始,我们进入实战模块,从真正解决问题的角度来看看,如何将我们此前学到的知识灵活运用到实际工作中。问题定位和技术选型加入我现在面对一个实际的算法题,我需要从以下两个方面进行思考。首先,我们要明确目标。即用尽可能低的时间复杂度和空间复杂度,解决问题并写出代码;接着,我们要定位问题。目的是更高效地解决问题。这里定位问题包含很多内容。例如:这个问题时什么类型原创 2020-09-25 18:21:38 · 174 阅读 · 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 · 336 阅读 · 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 · 213 阅读 · 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 评论 -
Android进阶课学习(24-26)
第24讲:APK如何做到包体积优化?因为每个项目的背景、实现方式都不尽相同,导致各个项目之间能列出的共性相对较少。本节主要从两部分谈谈对包体积优化的一些尝试:安装包监控、安装包大小优化。安装包监控Android Studio 的APK Analyser analyser的使用非常简单,只需将需要分析的apk文件拖入Android Studio即可,它会显示各项内容所占的大小,并按照大小排序,比如图片占用了比较大的资源空间,可以针对其做压缩优化等操作。Matrix 的ApkCh...原创 2020-09-16 11:48:19 · 352 阅读 · 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进阶课学习收获 (13~18)
第13讲:Android是如何通过Activity进行交互的?taskAffinity 单纯使用taskAffinity不能导致Activity被创建在新的任务栈中,需要配合使用singleTask或者singleInstance。我们可以在命令行里输入 adb shell dumpsys activity activities 来输出日志 查看任务栈情况,其中一个TaskRecord代表一个任务栈,如下:taskAffinity + allowTaskReparenting...原创 2020-08-28 18:47:58 · 476 阅读 · 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 评论 -
持续学习--Handler原理
线程之间通过Handler机制通信的大致流程:Handler通过sendMessage()、postMessage()以及对应的一些delay方法来发送消息; 消息队列MesageQueue通过enqueueMessage()将消息加入队列(其实是单链表,并且在插入的时候是从头部开始,按照时间优先原则插入); Looper对象的loop()方法,不间断的通过MessageQueue的next()方法取message,取到msg后,调用msg.target.dispatchMessage(msg),其原创 2020-08-17 11:21:19 · 163 阅读 · 0 评论