- 博客(336)
- 收藏
- 关注

原创 程序员装机必备软件
这里记录我安装好系统之后必须要安装的一些软件官方地址。JavaSE JDK8:https://www.oracle.com/cn/java/technologies/javase/javase-jdk8-downloads.htmlAndroid Studio:https://developer.android.google.cn/studioIntelliJ IDEA:https://www.jetbrains.com/idea/Everything:https://www.voidtools.
2021-04-22 11:07:13
916

原创 广州图书馆
写篇博客记录一下广州图书馆吧!今年的某一天第一次去广州图书馆,里面是真的宽广、干净又安静,图书很多,我想要的书几乎都有,可以说,你平时在广州购书中心想要买的书,在图书馆绝大多数都有,所以,为什么要花钱去买呢!而且图书馆里的书很多都是很新的,我以前天真的以为图书馆的书都是很旧的,我错了!广州图书馆里面环境真的很好,坐位超级多的,生怕你没地方做似的,可能是疫情期间,进馆需要预约,所以我看到坐位那么多,还没几个人做,不知道没疫情时没人数限制那时是不是坐位暴满的场面,就恨自己以前为什么不早点去图书馆逛逛,这样就
2021-02-03 15:47:16
975
4

原创 想学习的内容零散笔记
突然间发现,可以学的东西好多,自己好多东西不会,好落后了,Android已经出了好多好用又新的东西自己都没花时间去学,不是学不会,只是没去学。谷歌还是很做实事的,Android更新非常快,包括android系统和相应的api,文档也是越来越丰富(相比早期的简单文档),可以看出谷歌是一家做实事的公司,是一家好公司,做Android,不会错的,关键看自己的学习能力了。在这个互联网时代,手机、电脑很容易分人的心,经常不记得自己要干什么了,所以这里记录一下自己想学的东西,迷茫的时候就来翻翻这个日志,找点喜欢的东
2020-09-10 17:00:12
638

原创 一看就懂的i++和++i详解
我相信很多朋友可能之前已经百度过i++和++i的相关文章了,也做过不少的练习,觉得自己已经深刻掌握了它们之间的原理了,真的是这样的吗?来试试计算一下我下面提供的几道练习,你就会发现你又不会了!
2020-05-09 22:10:35
53704
155
原创 各种版本Android Studio下载地址
当前(2025-07-05)官方提供的版本最旧的只能到2017年的版本了,有时候想安装旧的版本,比如我在学Gradle时,有教程在讲解时使用的Android Studio是较旧的版本,所以我想保持开发环境一样,这时就需要下载到旧的版本,但是官网上已经找不到下载链接了,所以我从网络上搜索到了一些官网下载地址,所以安全性没问题,可以使用迅雷下载,有些可能直接在浏览器上下载不了,但是迅雷上可能有资源就能下载。
2025-07-05 12:01:55
537
原创 Kotlin中优雅的一行行读取文本文件
一行一行的读取文本文件的需求是很常见的,使用Java的方式比较麻烦,而使用Kotlin有非常简单且优雅的方式。
2025-07-04 17:59:19
933
原创 Typora使用教程(包括图片自动上传)
本教程来源于Typora教程官网,所以这里的Markdown语法在Typora中肯定都是支持的,但是在别的Markdown软件或者博客日志里面就不一定有用了,比如这里的大多数语法也同样适用于CSDN文章,但是有少数语法CSDN文章是不支持的。
2025-06-26 14:48:06
787
原创 android脱糖
`Android 5`、`Adnroid 6`系统原生只支持到`Java 7`,`Android 7`原生仅支持部分`Java 8`特性(比如Lambda表达式),到了`Android 8`则完整支持`Java 8`了。我们写Android项目时,对于兼容性,一般来说指定`minSdk`就可以了,比如`minSdk`设置为21,对应为`Android 5`,也就是说这个项目需要兼容的最低版本是`Android 5`,假设我们把`targetCompatibility`和`jvmTarget`设置为11,那生
2025-06-24 20:59:28
683
1
原创 Android Studio中的各种Java版本区别
Android Studio里面有各种各样的Java版本设置,看的人头花眼乱,分不清各是什么作用的,所以本文就来分别来研究一下这些个Java版本是做什么用的。
2025-06-24 20:25:37
683
原创 Sublime text启用vim
摘要:本文介绍Sublime Text中启用Vintage模式(Vim插件)的配置方法。1)修改首选项设置,移除Vintage插件忽略项;2)通过vintage_start_in_command_mode参数设为默认vim命令模式;3)添加快捷键配置,实现按jk组合键快速退出插入模式。配置包含JSON代码示例和操作截图,确保Vim编辑体验更加高效。全文约150字,涵盖主要配置步骤和参数说明。
2025-06-21 13:40:56
282
原创 so16k对齐
Android 15+要求SO文件16K对齐才能上架Google Play。官方文档显示:使用NDK 28+编译时默认已16K对齐,无需特别配置。文档还提供了验证对齐方法、编译配置以及现有SO文件的修改工具。开发者可通过Android官方指南(链接)获取完整解决方案,无需依赖AI问答工具。
2025-06-19 10:01:52
158
原创 修改Typora快捷键
摘要:本文介绍了如何修改Typora的代码块快捷键。由于默认快捷键Ctrl+Shift+`操作不便,作者将其改为Ctrl+Shift+J以方便记忆和使用。具体步骤是通过高级设置文件conf.user.json添加键位绑定配置,修改后重启Typora即可生效。文章提供了详细的修改位置示意图和最终效果截图。
2025-06-14 17:29:00
228
原创 typora图片左对齐
在Typora中将图片默认居中对齐改为左对齐的方法:打开文件偏好设置中的主题选项,编辑Github主题的CSS文件,添加自定义样式代码p .md-image:only-child{width:auto;text-align:left},保存后重启软件即可实现图片左对齐效果。操作简单,仅需修改CSS文件无需复杂设置。
2025-06-14 16:26:05
274
原创 Android中的DX、D8、R8
Android编译工具演进对比:DX已被D8替代,R8成为终极方案。DX需多步骤处理,效率低;D8整合脱糖,速度提升30%;R8实现五合一功能(脱糖+优化+混淆+压缩+dex生成),dex体积比D8减小10-20%,构建速度比"D8+ProGuard"快2倍。当前项目只需在gradle中启用minifyEnabled即可使用R8全部功能。R8已成为现代Android开发的官方推荐编译方案。
2025-06-13 22:41:59
691
原创 执行gradle的Java版本配置
Gradle运行依赖JDK环境,默认使用JAVA_HOME指定的JDK版本。通过gradlew -v可查看Gradle版本及其内置工具版本。Gradle包含两种JVM进程:Launcher JVM(短暂运行,负责启动)和Daemon JVM(长期运行,执行构建任务)。Android Studio中Gradle使用的JDK版本由IDE设置决定,而非gradle.properties配置。建议在gradle.properties中显式配置org.gradle.java.home以确保构建环境稳定。
2025-06-12 09:39:09
1015
原创 把GPS轨迹显示到百度地图
本文介绍了一个将Android设备采集的WGS84坐标转换为百度地图坐标系并可视化展示的解决方案。通过HTML页面实现文件上传、坐标转换和地图显示功能,主要包含以下内容: 前端页面设计:包含文件上传控件、状态显示区和百度地图容器 核心坐标转换算法:实现WGS84→GCJ02→BD09的三步坐标转换 动态显示逻辑:逐点处理GPS.txt文件,每500ms显示一个转换后的坐标点形成轨迹效果 代码提供了完整的解决方案,只需替换百度地图AK即可使用,适用于轨迹可视化、定位数据展示等场景。转换算法基于公开的坐标偏移参
2025-06-10 09:59:15
1075
原创 Android端口转发
Android设备同时连接Wi-Fi和有线网络时,需要使用端口转发来访问不同网段的网络摄像头。本文介绍了如何使用开源应用FwdPortForwardingApp实现端口转发:在Wi-Fi接口(如wlan0)监听5545端口,将请求转发到摄像头IP(192.168.2.100:554),使电脑可通过192.168.1.100:5545访问摄像头流。注意监听端口需在1024-65535范围内。该方案解决了跨网段设备访问的问题。
2025-06-06 16:31:43
579
原创 android无root抓包(PCAPdroid)
PCAPdroid 是一款注重隐私的开源应用程序,可让您跟踪、分析和阻止设备中其他应用程序建立的连接。它还允许您导出流量的 PCAP 转储、检查 HTTP、解密 TLS 流量等等!PCAPdroid 模拟 VPN 以便在没有 root 的情况下捕获网络流量。它不使用远程 VPN 服务器,而是在设备上本地处理数据。使用Fiddler代理可以给Android抓包,但是它抓的是TCP连接的,PCAPdroid 则没有限制,比如我的App使用UDP连接也可以捕获。
2025-05-29 16:14:41
982
原创 Apifox环境变量
本文介绍了在API测试工具中临时变量和全局变量的区别与用法。临时变量仅在单个请求内有效,无法跨请求共享,而全局变量可在整个项目范围内使用。文章通过具体示例展示了如何在请求间共享变量:前置操作设置变量、全局变量管理、JSON响应数据解析提取变量值等。还介绍了全局参数自动添加机制,以及如何通过代码动态修改全局变量值。关键区别在于:临时变量是内存临时存储,全局变量会持久化保存;临时变量覆盖范围有限,全局变量可跨请求共享;未预先定义的全局变量可通过代码自动创建。
2025-05-27 17:28:19
1124
原创 Kotlin带接收者的Lambda介绍和应用(封装DialogFragment)
方法的调用封装到了方法里面,这样重复的代码就只写一次,不用每次都写了。这里,对于 “确定” 和 “取消” 按钮也是很常用的,而且不管你是点了确定还是取消,点击之后对话框都会自动取消,所以上面代码中的。从对比上来看,长得差不多,带接收者就是把括号中的参数移到括号前面,并加了一个 “.” ,带。参数大多数情况下都是用不到的,但是每次都要写也很麻烦,而且函数名。这样做是可以的,但是真的很麻烦,能不能像。又是可以省略不写的,基于这个特点,我们不能给带接收者的。这里面有一些代码是每次都一模一样的,所以还可以优化,
2025-05-05 23:31:04
1078
原创 使用TortoiseGit进行文件比较
当你同步时,Git会检查 “我的文件” 与 “基础文件” 的差异,提交时就是把差异提交上去,同时也会检查 "远端文件"中是否有更新的提交,如果有,则会让你先拉取远端文件,拉取后,你的电脑就会有 “基础文件”、“我的文件”、“远端文件”,三种文件同时存在了,Git 会把 “我的文件” 和 “远端文件” 也进行差异比较且会合并差异合成一个文件,如果有冲突还会要你解决冲突,解决了之后才能提交推送到远端。所以,如果我们要比较两个没有版本控制的文本文件,一般选基础文件和我的文件进行比较即可。
2025-04-28 09:29:16
317
原创 Android协程
class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) lifecycleScope.launch { launch(Dispatchers.Def
2025-04-14 15:32:57
234
原创 Kotlin协程入门
前言现在还在学习阶段,无法写的详细,先写一些自己需要记的东西。InteliiJ开发环境这里,我们使用免费的IntelliJ IDEA 2021.3.3 Community版本。创建一个项目,设置如下:创建后,项目结果如下:可以看到,自动生成了一个Kotlin文件,可以直接点击main函数左侧的绿色三角形以运行main函数。join()函数fun main() = runBlocking { val job = GlobalScope.launch { delay(
2025-04-14 15:32:08
1120
1
原创 kotlin的takeIf使用
用于判断指定对象是否满足条件,满足就返回该对象自身,不满足返回null。因为可以返回对象自身,所以可以用作链式调用,以简化代码,又因。然后有个需求是判断一个女性是否达到法定结婚年龄,如果达到了的话就打印一个消息到控制台。可能返回空,所以常常和。
2025-04-11 16:08:56
356
原创 Gradle软件下载的镜像
腾讯云镜像:https://mirrors.cloud.tencent.com/gradle/gradle-8.11.1-bin.zip。华为云镜像:https://repo.huaweicloud.com/gradle/gradle-8.11.1-bin.zip。阿里云镜像:https://mirrors.aliyun.com/gradle/gradle-8.11.1-bin.zip。今天(2025/3/28)试了阿里云镜像无法访问,另外两个正常。使用国内镜像源(推荐)。
2025-03-28 23:44:35
2129
原创 阿里云云效 Maven
官方插件(如 org.jetbrains.kotlin.android)社区插件(如 com.github.spotbugs、io.spring.dependency-management)gradle的官方插件通常不会托管到或google()。包含几乎所有 非 google() 系的 Java 库(当然也包含kotlin)。仅包含 Google 官方发布的库。
2025-03-28 03:13:02
903
原创 使用Apifox动态生成请求参数
假如“自定义脚本” 在上面,如果我们在自定义脚本中想读取替换后的变量,则会读取不到,因为自定义脚本运行时,变量替换的脚本还没有运行。比如,我要调试一个登录请求,使用Apifox来进行调试,登录请求需要一个密码,这个密码需要进行AES加密后才能发送出去,我希望在Apifox中我填入明文密码,然后Apifox帮我进行AES加密后再发送出去。如上图,可以看到响应体中的密码就是加密后的密码了,后面再调试时,我们密码随便换,只需要填入明文密码,工具会自动帮我们加密。参数移除,然后添加经过加密后的参数。
2025-02-27 18:30:20
1424
原创 查询网络类型以及请求特定网络和绑定到特定网络以及监听网络变化
绑定指定的网络,确实是可以的,比如我想绑定我的App就用移动网络,即使连了wifi也走移动的网络,不走wifi,经实验确实是OK的,wifi明明连接了,但是还是可以走移动的网络进行通信。这里我们只监听wifi网络的变化,如果蜂窝网络发生变化我们就不知道,如果我只想知道当前默认网络的变化,默认网络即当前正在使用的网络,比如你当前有蜂窝网络,同时也连着WIFI,如果你的应用正在使用WIFI网络来进行网络传输,则WIFI网络为默认网络,不论当前默认是什么网络,想要监听它的变化可以使用。中只包含了wifi网络。
2024-12-26 11:12:36
1278
原创 设置首选网络类型以及调用Android框架层的隐藏API
而有的手机甚至连关闭5G的功能开关都没有,也没有首选网络类型的设置界面,这很不方便,比如有时候测试,我就希望使用4G网络,但是手机上没有设置可以去进行修改,怎么办?这个首选网络类型的设置,一般都会有一个类型最全的,即包含移动/联通/电信,且包含5G/4G/3G/2G的选项,且这个选项一般排在最前面,这样的选项用英文描述为“Global”,有全面的/全球的意思,意思就是你用这个选项,你插什么卡都能用,比如联通/电信/移动,而且不管你是4G、3G还是2G都能用。在新一点的版本手机中,还会有5G的选项。
2024-12-25 08:58:44
1827
原创 Android串口开发中的计算校验码
串口开发中,数据是7个字节的,计算校验码就是把中间的5个字节相加(不要头和尾),得到的校验码用作7个字节中的最后一个字节,所以5个字节相加的和最多只能是1个字节的大小,但是相加的结果很可能大于1个字节,所以如果使用int类型来保存相加结果的话,就需要转换为int,但是不能直接转,直接强制转换类型可能结果会不对,首先需要把结果。,这样就只保留了int中的最后一个字节了,且不存在负数问题了,这样再转换为。更好的做法是在保存结果的时候直接使用。来保存,这样就不需要。
2024-12-18 17:59:23
240
原创 Android获取sim卡频段信息
公司一些Android设备,在交给客户使用时,需要使用sim卡网络,但是有时候网络不好,要给客户证据说明是网络问题,一个办法是网络测速,还有就是获取一下频段信息,根据这个信息可以和中国移动沟通问题来源,比如在某些地方,移动只部署了一两个频段,而有的频段速度快,有的频段速度慢,所以可以通过频段信息判断网络问题。
2024-12-18 10:00:56
916
原创 java中整型的大端和小端
验证一个 int 变量在栈内存中是大端还是小端存储,需要通过一些间接方式,因为 Java 不允许直接操作内存地址。比如在Java中声明了一个 int变量,这个变量在栈内存中分配内存地址,那当int值保存到栈内存中时是用大端还是小端?在读写多字节值以及为此字节缓冲区创建视图时使用该字节顺序。这个不用猜,直接看JDK文档即可,比如,使用。我们可以通过 JNI 编写一个本地方法来直接读取栈内存中保存的 int 变量的字节序。在 Java 中,int 类型变量在栈内存中的存储方式(大端或小端)是由。
2024-12-06 11:07:31
773
原创 String IP和Int IP的互相转换
android中,wifiManager.connectionInfo.ipAddress 可以获取到wifi的ip地址,但这是一个int值,如何转换为常见的如192.168.1.129这种形式,以及这种形式如何转换回int值的形式。这里ip分为4段,每一段的值都是0 ~ 255,这正好是1个无符号字节就能表示的,所以ip的值用4个字节就可以保存,4个字节刚好又和int的大小相同。转换为字符串格式: 使用 InetAddress 是更可靠的方式,但手动方式也适用于这种简单情况。方法 2: 手动转换。
2024-12-05 15:28:02
729
原创 Kotlin中泛型的协变
如上代码,List是一个协变类型,所以泛型Shape可以接收Circle,这是没问题的,因为List是只读的,那么List中的元素就只可能是Circle类型,不会发生改变。如上代码,第一行赋值语句是OK的,第二行赋值语句在编辑器上直接就报错了。如上代码,在编辑器中是直接报错的,因为MutableList不是只读的,它可以增、删除 、改,比如。如上代码,如果非协变类型可以子类给父类,这将导致异常,所以在编辑器中这种赋值时会直接报错。只读集合类型是协变的,相反,可变集合不是协变的。协变不协变有什么用?
2024-11-15 16:35:27
506
原创 HandlerThread的使用
在处理事件时是在主线程上运行的,为了预防阻塞主线程,我们就需要另外再开启子线程来处理。方法是运行在子线程中的,当我们在登录时,立马就点击注销,此时注销代码不会马上被执行,因为登录操作需要5秒钟时间,它阻塞了线程,当登录操作结束后,注销的代码就可以马上得到执行了。方法的区别在于后者会等待处理完所有先前在任务队列中的任务再结束循环,比如,我们连续点击两次登录按钮,然后立马点击结束线程按钮,如果是。函数之后,再往消息队列中新添加的消息将不会被执行,比如按了结束线程按钮后,再按登录按钮,则登录操作不会被运行。
2024-11-06 14:43:51
690
原创 Looper.loop()的阻塞机制
这些系统调用允许线程在文件描述符(通常是消息队列的读端)上等待事件的发生,从而在有新消息时将线程唤醒。当没有任务时,线程会挂起等待新任务,一旦新任务到来,线程会被唤醒继续处理。没有消息可处理时,它会让线程进入等待状态,避免无意义的资源消耗。当没有新消息时,这个方法会阻塞当前线程,使线程进入等待状态;当有新消息到来时,它会被唤醒。中,当消息队列为空时,线程会被挂起,进入等待状态;当有新消息加入时,线程会被唤醒,继续处理消息。当有新消息时,通过底层的。是一个无限循环,当没有新消息时,它是如何挂起的?
2024-11-06 10:30:51
702
原创 处理器用handler表示还是用processor表示比较好?
在计算机硬件中,比如 CPU、GPU 或其他专门的处理单元,通常用 “processor” 表示。在开发中,编写代码时经常会用到处理器,如果是自己创建处理器,那这个类名中的处理器单词用哪个?:当强调一个“处理器”在数据流或系统架构中的角色,且它负责较大任务或持续的数据处理流程时。:当它是用于事件响应或执行单一、细粒度的操作时。特别是瞬时的、具体的事件或消息处理。:如果是在数据处理流水线或流式处理场景中,例如处理一系列数据或事件的步骤,使用。通常用于较小、具体的处理逻辑,而不是完整的任务。
2024-11-06 09:50:09
462
sokit-1.3-win32-chs(中文版)
2023-02-21
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人