- 博客(287)
- 资源 (5)
- 收藏
- 关注
原创 CSDN去广告插件
如果这篇博客被CSDN相关工作人员审核到,请你转告你们产品或者商务主管庞大的程序员群体不是你们这些无耻商人的待宰羔羊用csdn快3年了吧,写了200多篇博客,刚开始用的时候充满了期待,觉得这是一个能记录我成长的平台但是随着广告的无孔不入我开始慢慢怀疑CSDN是不是下一个视觉中国!侵权不去保护,广告肆意展示,联合百度的大数据分析和广告的投放,让很多程序员感觉得到了恶心!我们不反对你们盈利但...
2019-04-28 22:57:13 1021 1
原创 谈谈我对Gson源码的理解
fill:#333;GsonBoundFieldfromJson()可能存在递归调用栈溢出的地方getBoundFields() 获取该类所有字段createBoundField() 每个字段去找自己的getAdapter()read()construct() 反射创建对象遍历每个字段调用 read() 赋值每个BoundField对应的TypeAdapter处理 read()GsonBoundField注意蓝色区域, 这里有可能存在递归调用的风险, 我们来举例说明。
2024-02-25 22:01:29 925
原创 记一次 Android CPU高使用率排查
测试同学反馈我们的App CPU使用率 90% 居高不下,经过一番艰难的排查后定位到了问题,为了记录此次过程于是有了此博客的构思,但为了避免隐私泄露,本文使用的是demo工程,但是排查思路完全一致。我们发现 com.demo.app CPU占用率竟然高达 93.3%, 对应的 pid 是 29337。先找1中CPU使用率异常的时刻和对应的线程名, 再找 2中对应时刻的堆栈。如果CPU在某段时间较高但是之后就下降了就不好排查了, 不过也有笨方法。根据 Thread-2 线程名匹配到了 对应的 堆栈信息。
2024-02-02 19:47:18 689
原创 他山之石(2)—— Timber 如何实现默认打tag的
在使用Timber的时候发现了一些体验较好的地方,逐一分析下是怎么实现的。打印如下: 这个MainActivity是如何打印出来的呢?普通打印, 需要输入tag。
2024-01-15 00:30:38 445
原创 DiffUtil + RecyclerView 在 Kotlin中的使用
很惭愧, 做了多年的Android开发还没有使用过DiffUtil这样解放双手的工具。
2023-12-18 23:34:21 1119
原创 【开发问题记录】01—大量数据同时插入数据库导致的时间戳重复问题
也可以从数据库的查询上考虑如何解决: 时间戳相同的情况下,如何自定义返回顺序。这个我还没有研究明白,欢迎大家补充。推荐指数 5颗星 ⭐️⭐️⭐️⭐️⭐️。
2023-07-30 23:33:55 386
原创 Java基础361问第15问——线程安全的方法
提到线程安全想必大家并不陌生,但是为什么真正项目中遇到多线程问题的时候却很棘手?很大一部分原因是我们只学理论走马观花看了几篇博客背了几个面试点就以为自己掌握了,Talk is Cheap, Show me the code!因此这篇文章我会结合具体的代码介绍几种线程安全的方法和注意事项,希望能给你一个清晰地印象。我们以火车售票场景为例,假如有两个窗口同时卖票,代码如下System . out . println(name + "售票成功!还剩 " +(-- tickets) + " 张票~");
2023-03-20 22:47:59 475 1
原创 写给Android开发者的SQL教程
SQL(Structured Query Language)是一种用于管理关系型数据库的标准化语言。在关系型数据库中,数据以表格形式存储,这些表格之间通过关系进行连接,使得数据之间的关系和结构非常清晰易于管理大部分人把数据库和SQL混为一谈其实是错误的, SQL只是对应的关系型数据库, 那么有哪些关系型数据库呢?SQLite:一个轻量级的开源关系型数据库管理系统,支持多种平台和操作系统,适用于嵌入式设备和移动应用程序。(Android 采用的就是SQLite数据库)
2023-03-15 22:48:28 560
原创 谈谈我对Retrofit源码的理解
square/retrofit Github地址 最新版本从这里获取!Retrofit 是一款由 Square 公司开发的用于 Android 和 Java 应用程序的网络请求库,旨在简化 HTTP 网络请求的过程,Retrofit 最初是在 2013 年开源发布的,已经风靡了10年。其优点如下简化网络请求的过程:Retrofit 可以根据 API 接口定义文件自动生成网络请求代码,从而避免了手动创建网络请求代码的繁琐工作。方便处理网络请求。
2023-03-05 23:00:50 364
原创 三分钟学习 Gitee OpenAPI
简单说就是网络请求Open API 让我们可以通过网络请求的方式对 Git仓库的分支,提交,仓库,标签,PR,issue等属性进行操作。
2023-02-13 23:03:52 813 1
原创 Git 合并多条commit
按照上述操作继续编辑合并后的commit信息,再然后ESC, :wq保存即可。选中要修改的commit 右击选择Squash Commits。(这里稍微提一下, commit大本营,骚操作都在这里)键盘敲击 “I” 进入编辑模式, 把pick 改为 s。点击"ESC"退出编辑模式, 再输入 “:wq” 保存。
2023-01-12 22:00:51 3137 2
原创 开发利器! 利用Android Studio抓包
使用App请求网络会发现NetWork Inspector上有蓝色折线图4,鼠标选中这个区域后会发现5,点击5会出现6。整个过程不用1min,看图懵逼的话不如去自己亲身试验一下,非常好用的功能!最近新学了一个技能 —— Android Studio 本身就可以抓包。按照下图123操作, App运行起来后attch上。
2022-12-27 21:14:46 1430 1
原创 Dot Executable: /usr/bin/dot File does not exist Cannot find Graphviz.
PlantUML Integration 或者 PlantUML Parser 使用过程中报错如下
2022-12-12 22:03:16 1095 1
原创 Gradle学习第一篇——自定义Gradle插件
自定义Gradle插件有三种方法,各有优劣处就是如此简单,但是缺点是这个插件只能在这个build script使用,完全无复用的能力,其他Module要是想用的话必须拷贝一份在当前目录下创建buildSrc目录,创建完毕之后Sync一下build.gradle 中复制如下代码配置完成去App中运行测试一下这种稍微麻烦点,但是可以做到同项目内plugin复用了。这个和第二种有些地方是类似的首先创建一个Library Module剩下的步骤和 Mac搭建本地Maven仓库For Andr
2022-12-05 22:38:34 822
原创 聊一聊HashSet
坦白讲, 开发了多年Android但是我基本上没有用到过HashSet,不如看下其源码希望以后有需求打过来的时候可以考虑用这种数据结构实现。文章目录1 HashSet本质上是什么呢? 集合2 HashSet 集合的特点是什么? 去重 && 无序3 HashSet 如何获取某个元素的呢? Iterator4 HashSet 使用中需要注意哪些问题?4.1 引用数据类型记得重写hashCode和equals方法4.2 想保证线程安全使用这段代码1 HashSet本质上是什么呢? 集合
2022-05-22 21:39:45 285
原创 Mac环境下生成 Protobuf Java文件
协议缓冲区是一种语言无关、平台无关的可扩展机制,用于序列化结构化数据。https://developers.google.com/protocol-buffers因为传输的是二进制数据流体积更小速度更快,协议轻便但是如何能对应上我们的使用Java Dart Go语言呢?文章目录1 安装protoc 命令2 新建 lbs_locations.proto3 执行命令1 安装protoc 命令brew install protoc2 新建 lbs_locations.protosyntax = "
2022-05-17 00:09:57 843
原创 Mac环境 使用 bsdiff 和 bspatch 生成补丁包
bsdiff and bspatch are libraries for building and applying patches to binary files.bsdiff and bspatch 是两个合成补丁包的C开源库,具体的地址见下方https://github.com/mendsley/bsdiff文章目录1 Mac 配置 bs环境2 生成 1.txt 和 2.txt 的 补丁包3 根据补丁包patch 和 1.txt 合成 2.txt1 Mac 配置 bs环境➜ ~ bre.
2022-05-15 00:09:19 423
原创 写段代码理解 scheduleAtFixedRate和scheduleWithFixedDelay
① 如果任务在周期内正常结束掉的话scheduleAtFixedRate和scheduleWithFixedDelay没有差别public void start() { ScheduledExecutorService pool = Executors .newScheduledThreadPool(1); System.out.println("this task startTime "); pool.scheduleAtF
2022-05-07 23:49:53 312
原创 BUG exception in phase ‘semantic analysis‘ in source unit ‘_BuildScript_‘ Unsupported class file ma
错误原因是因为你本地的java版本太高了~cd /Library/Java/JavaVirtualMachinesopen .把高版本的java 版本删除掉即可~
2022-03-02 08:46:50 12468 1
原创 Rxjava线程切换原理终于在2023年有了答案。
虽然项目中有用到Rxjava但是从来没有花功夫研究过所以对这里一直是懵逼状态,面试的时候也是很恐惧这方面的提问,但是Rxjava线程切换原理一直是面试必问的问题,与其心存侥幸不如直面恐惧,到了2022年,终于对这个问题有了一个完整的理解,如有理解偏差,还请指出。// 本次源码分析基于rxjava 3.0 // 使用最新的rxjava版本看这里 https://github.com/ReactiveX/RxAndroiddependencies { implementation 'io.re
2022-01-03 23:17:01 1825 1
原创 adb抓取日志到指定文件
为了方便抓取日志建议将日志记录器缓存区调整为16M 这样基本上都可以抓取到日志了手机连上adb之后,执行下面的命令就可以看到日志了adb logcat > a.txt
2021-10-18 23:01:51 1685
原创 【registerActivityLifecycleCallbacks】它是如何实现Acitivity页面变化监听的?
当我们想监听App页面变化(比如打开了哪个页面,关闭了哪个页面)的时候我们会使用registerActivityLifecycleCallbacks就像下面的代码一样。public class MyApplication extends Application { @Override public void onCreate() { super.onCreate(); registerActivityLifecycleCallbacks(new Acti
2021-10-10 11:33:38 231
原创 2021国庆所感
最近好久没有更新博客了,一来是工作太忙,二来也是我开始懈怠,学习劲头不高,三来也是家庭遭遇了一些变故导致没有时间和精力学习新技术。本来今年国庆节准备好好放个假去我对象家里掰玉米,但是我家突遭变故打乱了这些计划,且听我一一道来2021年8月15日 我叔叔(我爷爷的大哥的小儿子) 因病去世 (我因为在北京上班没有参与后事)2021年10月1日 C2173 因为买不到从北京直达聊城的火车,开始中转 北京南(23:56) → 天津(00:26)2021年10月2日 K128 天津
2021-10-08 17:33:13 117
原创 Flutter学习第九篇之 本地Flutter版本切换
在我们开发Flutter的时候肯定会遇到版本切换的问题,例如下图AB两个项目分别使用不同的Flutter版本,那我们本地运行项目的时候就需要在1.17和2.5.1之间来回切换。官方有一个Flutter Version Management命令行控制工具 感兴趣的同学可以用用,我本期要分享的是最笨的但是也是最纯净(不需要下载其他软件,不需要安装其他工具)的方法。// 1 进入你本地的Flutter SDK目录cd /Users/liangchaojie/Documents/flutter/
2021-09-25 18:21:51 4101 4
原创 Mac Android系统源码下载
文章目录前提① 安装Homebrew前提② 安装 curl 和 repo配置工具安装成功之后开始进行下载安装1 配置bin/repo2 新建文件夹开始下载前提① 安装HomebrewHomebrew 官方网站/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"前提② 安装 curl 和 repobrew install curlbrew install r
2021-08-27 21:41:22 349
原创 从命令行看Android系统启动过程
需要 Root 设备或者 使用 Android Studio 7.0以下系统的模拟器adb shellinit进程是Android系统的第一个进程root@generic_x86_64:/ # ps | grep "zygote"root 1316 1 1265640 63732 poll_sched 7f7e294bb74a S zygote64root 1317 1 1253768 53252 poll_sched 00f7351420 S z.
2021-08-22 16:58:46 184
原创 【Flutter源码学习】Dart和Android通信原理
本篇源码分析基于以下环境[✓] Flutter (Channel stable, 2.2.3, on macOS 11.4 20F71 darwin-x64, locale zh-Hans-CN) • Flutter version 2.2.3 at /Users/liangchaojie/Documents/flutter • Framework revision f4abaa0735 (6 weeks ago), 2021-07-01 12:46:11 -0700 •
2021-08-14 18:10:05 280
原创 Mac+Charles+Android+Https 抓包
感谢 Android端Charles抓包 这篇分享,大体都是按照这个套路来想抓别人的App就必须使用Android 7.0以下的手机,抓自己的可以使用高版本系统手机文章目录1 下载破解版版本Charles2 Charles代理设置2.1 Proxy → Proxy Settings2.2 配置 Https2.3 查看本机iP地址3 手机和电脑连到同一个Wifi 设置手动代理4 使用Android 7.0 以下系统的手机 按照上面的配置就可以正常抓到Https请求了,但是如果我们没有Android
2021-08-13 23:23:48 953 3
原创 聊聊 Looper中的 用户态、内核态、IO多路复用
做Android开发的小伙伴一定都熟悉Android的消息循环机制(Looper MessageQueue Handler), 相信也一定知道Looper是一个死循环,循环中 MessageQueue 不停地去拿消息处理,如果拿不到就阻塞当前主线程执行,下面重温一下这块的代码Looper.javapublic static void loop() { //... 省略无关代码 for (;;) { // 这里我把官方注释放这里了,next方法执行过程中可能会发生阻塞
2021-08-08 23:15:25 394
原创 Android Studio中如何全局搜索字节码中的内容?
文章目录1 我们的使用痛点是什么?2 我们为什么需要查看class文件中的内容呢?3 写代码把aar拷贝到目标文件夹中4 命令行查看具体的内容1 我们的使用痛点是什么?当我们使用Android Studio 搜索 MainActivity 的时候可以查到内容,好像看起来很方便?但是如果关键字在class文件中,那么就搜索不到了。2 我们为什么需要查看class文件中的内容呢?我们App上线之后发现用户使用流量猛增,使用各种统计手段发现程序大量创建一个名为 “xxx” (因为避免涉密不具体贴出
2021-06-26 22:08:53 1151 3
原创 操作系统——精髓与设计原理(第九版)
一直觉得自己计算机基础薄弱,买了本书看,打打基础, 这篇博客不是把书中的内容做一个总结,而是分享自己看书过程中的心得和体会。文章目录1 芯片?处理器?CPU?1 芯片?处理器?CPU?
2021-06-20 18:06:21 3989 1
原创 Android 居中圆角矩形 Loading框
相信项目中大家多多少少都会用到Loading框,用来优化一些体验网上找了很多demo但是 要么有的太复杂,要么有的不满意,最后还是自己决定写一个吧。文章目录1 UI效果2 源代码2.1 MsLoadingDialog.java2.2 MainActivity.java2.3 R.style.LoadingDialog2.4 icon_loading_ing.png icon_loading_success.png1 UI效果2 源代码2.1 MsLoadingDialog.javapu
2021-05-15 17:10:12 571 4
channelApk.zip
2019-08-13
Android实现快速发送电子邮件
2018-10-31
android扫码登录
2018-10-27
通讯录字母列表索引
2018-02-26
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人