- 博客(119)
- 资源 (4)
- 收藏
- 关注
原创 Android卡顿优化
Android系统要求每一帧都要在 16ms 内绘制完成,平滑的完成一帧意味着任何特殊的帧需要执行所有的渲染代码(包括 framework 发送给 GPU 和 CPU 绘制到缓冲区的命令)都要在 16ms 内完成,保持流畅的体验。这个速度允许系统在动画和输入事件的过程中以约 60 帧每秒( 1秒 / 0.016帧每秒 = 62.5帧/秒 )的平滑帧率来渲染。
2022-09-18 23:21:46 3707
原创 单测编写
1、上报相关单测 /** 被测代码 */ fun reportLikedVideoRemoveExposure(num: String?, feed: stMetaFeed?, rank: String?, userId: String?) { val map = JsonObject() map.addProperty("num", num ?: "") map.addProperty("rank", rank ?: "") .
2020-09-03 21:06:17 662
原创 加载本地gradle配置
1. 查看本地存在的gradle版本find ~ -iname "gradle-*.zip"2.build.gradle对应的Gradle Plugins插件版本https://developer.android.google.cn/studio/releases/gradle-plugin.html3.下载指定的gradle版本到指定目录比如到/Users/angela/angela/gradle-6.1.1.zip4.配...
2020-08-23 11:26:53 1574
原创 布局异步加载 - AsyncLayoutInflater
前沿我们知道布局加载的两大特性瓶颈,通过操作将XML加载到内存中并进行解析和反射创建View。当xml文件过大或者页面层级过深,布局的加载就会较为耗时。我们知道,当主线程进行一些耗时操作可能就会导致页面卡顿,更严重的可能会产生ANR,所以我们来进行布局加载优化呢?解决这个问题有两种思路,直接解决和侧面缓解。直接解决就是不使用IO和反射技术,我们这里介绍侧面缓解,即将布局加载和解析放在子线程中,等到inflate操作完成后再将结果回调到主线程中,即使用Android为我们提供的AsyncL
2020-06-06 15:21:32 4332
原创 单元测试mockk
单元测试基于kotlin的mockk:https://mockk.io/Mockito:侧重点是纯Java代码的测试:方法调用mock,指定方法行为,截取参数,截取Callback回调PowerMock : 支持JUnit和TestNG,扩展了EasyMock和Mockito框架,增加了mock private、static、final方法的功能。UI自动化测试框架:Ro...
2020-04-19 12:56:22 5345 1
原创 MediatorLiveData#addSource踩坑记录
1.关于MediatorLiveData的addSource()方法 /** * Starts to listen the given {@code source} LiveData, {@code onChanged} observer will be called * when {@code source} value was changed. * &...
2020-03-22 14:45:32 3552
原创 git相关操作
从已有分支拉出新分支1、切换到被copy的分支(master),从服务器拉取最新版本$git checkout master$git pull2、从当前分支copy出新的开发分支,命名dev分支$git checkout -b dev3、把新建的分支push到远端$git push --set-upstream origin dev4、拉取验证$git pu...
2019-11-26 19:00:03 190
原创 RecycleView吸顶效果
最近使用app时发现一个RecycleView滑动过程中组布局吸顶的效果, 记得以前学习ListView的时候也见过类似的效果,由于工作中没有真正使用过虽然那会看懂了,但是现在一点印象没有了。周末在家搜索了一下发现实现方案有几种,找了一种实现效果容易理解的把代码消化了一遍,顺便记录一下分析过程。效果图抽象类ItemDecoration 的几个方法 public a...
2019-11-10 17:15:58 542
原创 Degug调试
Gradle插件调试 buildSrc调试 Pycharm调试Gradle插件调试1、插件发布到本地仓库:uploadArchives{ repositories { mavenDeployer{ repository(url: uri('/Users/xxx/.m2/repository')) // ./repository } }}...
2019-10-17 17:14:46 278
原创 python-多线程/多进程
多线程多进程 最近同事接手我维护的打包项目时, 使用了Edit Configurations来配置运行参数, 测试的时候直接点击运行按钮。最开始我接手时每次修改代码都要push到git仓库, 然后到打包机脚本目录下pull最新代码, 再使用job打包验证。每次都是要经历这么痛苦的过程, 后来我优化了下, 将打包机上的命令复制保存起来, 每次修改脚本后就将保存的...
2019-10-13 22:22:20 411
原创 glide流程梳理
glide现在已经4.x了, 就以该版本的源码进行分析了.glide优势通过Fragment来监听页面生命周期来控制图片的加载与取消; 使用@GlideModel的方式可动态注册、替换图片加载器; glide初始化时注册加载器、转码器、编码器等; Target通过ViewTreeObserver来监听控件的宽高提供给BitmapFactory.decodeStream()来解码原...
2019-08-19 21:24:24 381
原创 主线程Looper.loop()里的死循环不ANR疑惑
引子:正如我们所知,在android中如果主线程中进行耗时操作会引发ANR(Application Not Responding)异常。当应用程序的UI线程响应超时才会引起ANR, 造成ANR的原因一般有两种:1. 当前的事件没有机会得到处理,例如UI线程正在响应另一个事件,当前事件被阻塞了。2. 当前的事件正在处理,但由于耗时太长没能及时完成。一般造成ANR的场景,从本质上将, ...
2019-08-03 22:55:25 1288
原创 Java 内存模型
并发编程模型的分类 在并发编程中, 我们需要处理两个关键问题: 线程之间如何通信及线程之间如何同步(线程指并发执行的活动实体). 通信是指线程之间以何种机制来交换信息. 在命令式编程中, 线程之间的通信机制有两种: 共享内存和消息机制. 在共享内存的并发模型里, 线程之间共享程序的公共状态, 线程之间通过写-读内存中的公共状态来隐式通信. 在消息传递的并发模型里, ...
2019-08-03 21:42:53 535 1
原创 网络库和图片库的简单架构模型
这里我们就简单分析一下demo中网络课和图片库的架构模型网络库基本模型架构设计过程分析:对于一个框架的设计, 使用面向接口编程是必不可少的技能,http/https是基于请求-响应模型, 我们需要抽象出一个请求和响应接口类,抽象一个请求接口, 其实现可以是基于HttpURLConnection、Socket等, 抽象接口是为了约束使用者构造请求时提供请求所需要的参数, ...
2019-07-24 07:24:40 954
原创 hook系统类方法的技术调研
需求背景前段时间组长让我调研一下一个技术需求, 需要在项目中每个调用Log.x(TAG, msg);的地方判断msg中是否有指定的字段来替换为我们自定义的方法来实现日志上报。需求调研首先想到了hook技术,Hook 又叫“钩子”,它可以在事件传送的过程中截获并监控事件的传输,将自身的代码与系统方法进行融入。这样当这些方法被调用时,也就可以执行我们自己的代码,这也是面...
2019-07-24 07:23:11 512
原创 自定义gradle插件进阶
上次写过自定义gradle插件入门的博客, 介绍了最基本的gradle构建和简单的自定义gradle, 运用生命周期函数、task依赖和扩展配置等。在上篇博客的基础上, 这篇博客继续研究下自定义gradle插件。动态编译技术在开源框架中的应用非常的广泛,现在市面上的插件化框架,热修复框架几乎都使用了动态编译技术,原理几乎都是在编译期间动态的在class文件中注入或者修改代码。AOP技术应...
2019-06-24 10:19:44 2174
原创 RxJava2.x的源码分析----线程切换
RxJava大家已经很熟悉了, 百度上关于RxJava的技术文章大把, 为了锻炼自己阅读源码的习惯, 现在阅读第三方库的时候做个记录, 假装自己看过开源库的源码.今天我们就分析RxJava的线程切换源码, 没有看过RxJava的基本调用过程的请移步RxJava的基本流程, 分析的demo代码如下:Observable.create(new ObservableOnSubscribe<...
2019-05-25 18:53:59 269
原创 RxJava2.x的源码分析----基本调用
RxJava大家已经很熟悉了, 百度上关于RxJava的技术文章大把, 我为了锻炼自己阅读源码的习惯, 现在开始阅读第三方库的时候做个记录, 假装自己看过开源库的源码.我们就从RxJava的基本使用来开始分析吧, 常用的使用方式如下所示:Observable.create(new ObservableOnSubscribe<Drawable>() { @Override...
2019-05-25 13:44:42 144
原创 浅析Android平台图像压缩方案
一、前言在 Android 中进行图片压缩是非常常见的开发场景,主要的压缩方法有两种:其一是质量压缩,其二是尺寸压缩。前者是在不改变图片尺寸的情况下,改变图片的存储体积,而后者则是降低图像尺寸,达到相同目的。在介绍Android平台的压缩方案之前,先了解一下Bitmap的几个主要概念。像素密度 像素密度指的是每英寸像素数目,在Bitmap里用mDensity/mTargetDen...
2019-05-19 22:55:53 648 1
原创 Java的四种引用方式
java内存管理分为内存分配和内存回收,都不需要程序员负责,垃圾回收的机制主要是看对象是否有引用指向该对象。java对象的引用包括 强引用,软引用,弱引用,虚引用。Java中提供这四种引用类型主要有两个目的:第一是可以让程序员通过代码的方式决定某些对象的生命周期;第二是有利于JVM进行垃圾回收。下面来阐述一下这四种类型引用的概念:1.强引用 是指创建一个对象并把这个对象赋给...
2019-05-19 13:48:37 410
转载 并发容器ConcurrentHashMap线程安全的使用姿势
什么是线程安全的数据结构?简单的说就是不同线程可以访问同一份数据时,它们对这份数据的访问是无序、随机的,是不可控的。比如说你的房间谁都可以进来,但是你不确定他们谁先来谁后来或者可能同时来。你想让整件事更有秩序的在你的掌控之中,至少不能同时进来,于是就给房间上一把锁,每次只给一个人钥匙,他出来还钥匙之后你再给下一个人。这种带锁或等价机制的数据结构,就是线程安全的。什么时候需要使用...
2019-05-18 20:25:23 744
原创 多线程按顺序执行
一.前言本文使用了5中方法实现在多线程中让线程按顺序运行的方法,涉及到多线程中许多常用的方法,不止为了知道如何让线程按顺序运行,更是让读者对多线程的使用有更深刻的了解。 使用的方法如下:[1] 使用线程的join方法 [2] 使用主线程的join方法 [3] 使用线程的线程池方法 [4] 使用线程的CountDownLatch(倒计数)方法 [5]使用线程的Semaphore(信...
2019-05-18 16:39:05 4362
原创 加密算法的比较和项目中的应用
加密技术通常分为两大类:"对称式"和"非对称式"。对称性加密算法:对称式加密就是加密和解密使用同一个密钥。信息接收双方都需事先知道密钥和加解密算法且其密钥是相同的,之后便是对数据进行加解密了。对称加密算法用来对敏感数据等信息进行加密。非对称算法:非对称式加密就是加密和解密所使用的不是同一个密钥,通常有两个密钥,称为"公钥"和"私钥",它们两个必需配对使用,否则不能打开加密文件。发送双方A,...
2019-05-17 11:20:44 632
原创 android常用加密方案——三重DES实现
一什么是三重DES三重DES是为了增加DES的强度,将DES重复3次所得到的一种密码算法,通常缩写为3DES。二三重DSE加密明文经过三次DES处理才能变成最后的密文,由于DES密钥长度实质是56位,因此3DES的密钥长度就是56*3=168比特。注意:三重DES的三次DES加密是(加密->解密->加密),而不是(加密->加密->加密),为什么这样设计呢...
2019-05-17 10:59:24 768
原创 android常用加密方案——AES实现
高级加密标准(英语:Advanced Encryption Standard,缩写:AES),是一种区块加密标准。这个标准用来替代原先的DES,已经被多方分析且广为全世界所使用。那么为什么原来的DES会被取代呢,,原因就在于其使用56位密钥,比较容易被破解。而AES可以使用128、192、和256位密钥,并且用128位分组加密和解密数据,相对来说安全很多。完善的加密算法在理论上是无法破解的,除...
2019-05-17 10:18:53 1899 1
原创 一次线上bug的追踪
最近快要过年了,项目上也不是很忙,就是做些修修补补的工作,下午组长给我一个任务,把我拉进一个风控部门建立的群。看了下问题描述: 线上某壳拉新时大约有三分之二的新用户升级到2.3.0版本时上报的某盟id为null。接到这个任务后头脑里一片空白,竟然不知如何下手,线上apk没法调试,而且是偶现的bug。 线上bug,能做的就是先下载线上有bug的apk本地...
2019-01-26 17:36:18 1449
原创 flutter知识点
加载本地图片:1. lib同级目录下新建一个images文件夹2. pubspec.yaml文件下,注意空格格式assets: - images/img_load_fail.png3. 代码中使用image: new DecorationImage( image: new ExactAssetImage('images/img_load_fail.png'),...
2019-01-09 15:56:26 608
原创 NDK在验签加密项目中的应用
基本概念介绍 JNI 全称 Java Native Interface,Java 本地化接口,可以通过 JNI 调用系统提供的 API。操作系统,无论是 Linux,Windows 还是 Mac OS,或者一些汇编语言写的底层硬件驱动都是 C/C++ 写的。Java和C/C++不同 ,它不会直接编译成平台机器码,而是编译成虚拟机可以运行的Java字节码的.class文件,通过JIT技术即...
2018-11-27 23:15:16 280
原创 自定义gradle插件入门
Android GradleAndroid项目使用 Gradle 作为构建框架,Gradle 又是以Groovy为脚本语言。所以学习Gradle之前需要先熟悉Groovy脚本语言。Groovy是基于Java语言的脚本语言,所以它的语法和Java非常相似,但是具有比java更好的灵活性。下面就列举一些和Java的主要区别。Android Gradle 的 Project 和 Tas...
2018-09-01 22:39:25 1685
原创 python-数据库操作
import pymysql数据库工具类 db_util.pyclass db_util: # 构造函数 def __init__(self, host='12.31.120.104', user='root', pwd='123456', db_name='bugly'): self.host = host ...
2018-08-20 20:08:27 664
原创 ActionBar/Toolbar定制ui
最近项目对ui走查,由于谷歌的那套交互框架已经写好了,系统控件那边对样式定制失败,把锅甩给我们上层,鉴于时间紧,任务重,就没打算对框架级进行修改,单单就ActionBar/Toolbar进行样式修改,在修改的过程中,发现ActionBar/Toolbar这块的坑真多,尤其是各种间距问题。废话不多说了开始正题。 首先上效果图吧: 关于样式这块我也是第一次这么大动作的修改,部门大牛修改样
2017-12-04 22:54:48 466
原创 git命令
一、新建代码库# 在当前目录新建一个Git代码库$ git init# 新建一个目录,将其初始化为Git代码库$ git init [project-name]# 下载一个项目和它的整个代码历史$ git clone [url]二、配置/ Git的设置文件为.gitconfig,它可以在用户主目录下(全局配置),也可以在项目目录下(项目配置)。# 显示当前的
2017-11-25 13:48:06 266
原创 反射访问类的私有属性对象的私有方法
一、什么是反射机制 JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。JAVA反射(放射)机制:“程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言”。从这个观点看,Perl,Python,Ruby是动态语言,C++,J
2017-11-11 10:52:26 1603
原创 自定义ViewGroup考虑padding,margin
在View.java中:public final void measure(int widthMeasureSpec,int heightMeasureSpec){... onMeasure();...}protected void onMeasure(int widthMeasureSpec,int heightMeasureSpec)
2017-10-01 10:21:23 1216
原创 SQL的UNION使用
在构造方法中获取资源文件中的资源数值 TypedValue tv = new TypedValue(); context.getTheme().resolveAttribute(android.R.attr.actionBarSize, tv, true); mDefaultTabStripSize = context.getResources
2017-09-24 14:41:18 493
原创 DialogFragment被dissmiss()出现Activity的title栏后又消失
问题描述:查看联系人-分享-选择短信-新建短信-在跳转到短信编辑界面前会先显示一个短信框(always)现象:问题分析:1. 当点击取消或者dialog外面时,dialog会正常消失。 当点击新消息时就会短暂显示带有短信的浮动框 2. 通过Android Device Monitor的Hierarchy View发现显示短信的浮动框是DecorView的t
2017-08-17 16:30:04 1140
原创 ActionBar中OptionMenu弹出菜单的位置和overflow右边距的调整
ActionBar中OptionMenu的显示以前是显示在overflow的下面,5.0以后显示的位置直接覆盖了overflow图标在这里是通过修改样式的方式来解决显示问题解决方案1. 在values-v21 styles.xml文件中添加 false @color/action_bar_t
2017-08-17 16:03:55 8818
原创 Redis集群报错
使用redis做缓存版本说明 本教程使用redis3.0版本。3.0版本主要增加了redis集群功能。安装的前提条件:需要安装gcc:yuminstall gcc-c++ 1、下载redis的源码包。2、把源码包上传到linux服务器3、解压源码包tar -zxvf redis-3.0.0.tar.gz 4、Make5、Make install
2017-06-02 22:19:08 1642
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人