自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(79)
  • 收藏
  • 关注

原创 安卓图表MpAndroidChart使用

chart.viewPortHandler.setMaximumScaleX(Float.MAX_VALUE) // X轴无限放大。chart.viewPortHandler.setMaximumScaleY(Float.MAX_VALUE) // Y轴无限放大。lineDataSet.fillColor = Color.parseColor("#82F689") // 填充颜色。color = Color.parseColor("#5533B5E5") // 半透明蓝色。

2025-12-11 16:10:41 932

原创 Kotlin协程与Room数据库异步操作suspend与Flow

val list = database.userDao().getAllUsers() // Room suspend 查询,会在IO线程执行。suspend 表示挂起函数,它本身不会创建新线程,但可以挂起当前协程,让协程切换到其他线程去执行耗时操作,然后恢复。database.userDao().getAllUsers() // 后台线程。.catch { e -> Log.e("DB", "查询失败", e) }textView.text = "Hello World" // UI操作,主线程。

2025-12-03 09:23:21 445

原创 安卓内存管理原理与实战

在安卓开发中,内存管理是应用稳定性和性能的关键。了解安卓内存结构、垃圾回收机制和内存优化技巧,可以帮助开发者写出高效、低耗的应用,避免 ANR(应用无响应)和 OOM(内存溢出)问题。内存优化不仅提升性能,还能提升用户体验,降低崩溃率。掌握这些原理,你的应用会更稳定、更流畅。Native 内存 C/C++ 层分配的内存,如 Bitmap、OpenGL 资源。内存映射文件(Mapped Files) APK、dex、so 文件映射内存。Dalvik/ART 堆(Heap) 存储应用对象,受垃圾回收管理。

2025-12-03 09:23:12 391

原创 hexo更换新的主题

重启:hexo clean && hexo g && hexo server。先进入/var/www hexo对应的根目录。

2025-12-03 09:23:04 94

原创 服务器用多域名部署多个网站

如果使用泛域名 *.example.com,也可以所有子域名都指向同一 IP。使用子域名是多网站部署里最常见的方式。http://shop.example.com → 电商站。http://blog.example.com → 博客。http://www.example.com → 主站。shop.example.com → 电商站。blog.example.com → 博客。2️⃣ Nginx 配置示例(子域名方式)www.example.com → 主站。子域名 SSL 证书可独立或用泛域名证书。

2025-12-03 09:22:39 203

原创 服务器和域名解析

服务器是提供数据和服务的计算机或软件系统,分为 物理服务器 和 云服务器,按地理位置又可分为 国内服务器 和 海外服务器。域名是网站在互联网上的“门牌号”,DNS(Domain Name System)是将域名转换为服务器 IP 地址的系统。CNAME 别名记录,指向另一个域名 blog.example.com -> www.example.com。NS 指定域名服务器 example.com -> dns1.example.com。顶级域名(TLD):如 .com, .cn, .org。

2025-12-03 09:22:31 239

原创 python深度学习中的张量的形状是什么?

x = torch.randn(1, 3, 224, 224) # 随机生成一个张量。2 维张量 → 一个矩阵(表格,例如 [[1,2],[3,4]])4 维张量 → 一批彩色图片 [批大小, 高度, 宽度, 通道数]3 维张量 → 例如一张彩色图片 [高度, 宽度, 通道数]张量的 形状 就是它的 维度大小,告诉我们张量里有多少数据。1 → 批量大小(batch size),表示有 1 张图片。1 维张量 → 一个向量(数组,例如 [1, 2, 3])0 维张量 → 一个标量(单个数字,例如 5)

2025-12-02 09:31:06 153

原创 centos linux安装hexo 发布博客

一、安装依赖环境(Node.js + Git)

2025-12-02 09:30:55 894

原创 docker创建视频服务器

HLS: http://localhost:5080/hls/流密钥.m3u8。访问 http://localhost/stat 查看服务器状态和活动流。RTMP: rtmp://localhost:1935/live/流密钥。完整的推流 URL:rtmp://localhost/live/test。状态页面: http://localhost:5080/stat。服务器: rtmp://localhost:1935/live。服务器: rtmp://localhost/live。测试 RTMP 服务器。

2025-12-02 09:30:43 237

原创 安卓下轮询操作的几种方式

缺点:操作 UI 需要 Handler 或 runOnUiThread()。2. ScheduledExecutorService(后台线程)1. Handler + Runnable(最常用,简单)优点:在后台线程,不会阻塞主线程,可扩展。3. RxJava(如果项目已经有 Rx)优点:易于管理订阅和取消,UI 操作简单。优点:简单、直接、在主线程可操作 UI。缺点:任务在主线程执行,不适合耗时操作。缺点:依赖 RxJava。

2025-12-02 09:30:30 251

原创 鸿蒙网络请求示例

console.info('登录失败:', result.message);console.error('请求失败:', err);console.info('登录成功');

2025-12-02 09:30:16 484

原创 十进制二进制十六进制常用的数

常用的 0x0A=10, 0x10=16, 0x40=64, 0x80=128, 0xFF=255。| 十进制 (Dec) | 二进制 (Bin, 8位) | 十六进制 (Hex) |2 个十六进制位 (00~FF) = 1 个字节 (8 bit)1 个十六进制位 (0~F) = 4 个二进制位。-1 1111 1111 负数(补码表示)最小值:1000 0000 → -128。b6~b0 是数值位(7 位)十进制 二进制(8位) 说明。b7 是 符号位(最高位)范围:-128 ~ 127。

2025-12-01 09:26:09 448

原创 安卓中接口回调

activity或fragment中调用。

2025-12-01 09:25:49 473

原创 安卓权限申请使用

Toast.makeText(this, "权限被拒绝", Toast.LENGTH_SHORT).show();Toast.makeText(this, "权限被拒绝", Toast.LENGTH_SHORT).show();EasyPermissions Google 官方,轻量,回调简单 普通项目、入门推荐。RxPermissions RxJava 响应式 已经用 RxJava 的项目最方便。AndPermission API 链式,功能强大 中大型项目,UI 提示丰富。支持权限分组、申请多个权限。

2025-12-01 09:25:35 365

原创 as中git分支新建

修改新建的分支一点代码,然后提交,就会在远程仓库看到新分支。再点击新建的分支:merge into master。合并后直接再主分支git push,远程分支就修改了。master (鼠标右键,new branch)先local下先切换回主分支(checkout)

2025-12-01 09:25:20 93

原创 安卓按钮按下改变颜色

- 选中状态(可选) -->-- 默认状态(抬起) -->-- 按下状态 -->

2025-12-01 09:25:07 102

原创 安卓从assets目录下读取文件内容

/ 使用 Gson 解析为 List<Point>// 从 assets 读取 JSON 文件。

2025-11-30 09:56:56 201

原创 安卓logutils工具类

/ 使用应用私有外部存储目录: /Android/data/你的包名/files/AppLogs/// 记录应用上下文,初始化时调用。

2025-11-30 09:56:44 371

原创 安卓临时缓存sp工具类

支持对象存储(自动 JSON 序列化和反序列化)的 Android SPUtils 工具类,使用 Gson 实现对象与字符串的互转。// 获取集合或泛型对象(如 List<User>)// Getter / Setter 省略。✅ 支持对象的 SPUtils 工具类。✅ Gson 依赖(如果尚未添加)// 获取时需要指定 Type。✅ 示例数据类(User)

2025-11-30 09:56:32 391

原创 android多架构打包

✅ 原因:每个 ABI 会编译一份 .so 文件(Native 库),多架构直接打包 → 体积翻倍甚至更多。安卓打包时包含多个 ABI(CPU 架构) 的确会显著增大 APK 或 AAB 包体积。armeabi-v7a 主流 32 位 ARM 设备(绝大多数 Android 手机)只打主流架构(推荐 armeabi-v7a 和 arm64-v8a)arm64-v8a 主流 64 位 ARM 设备(目前主流)仅供线上发布(小体积) arm64-v8a(极致精简)x86 模拟器用(或极少量 Intel 手机)

2025-11-30 09:56:19 222 1

原创 安卓内存泄露排查LeakCanary

在 Android 开发中,内存泄漏是非常常见但又隐蔽的问题,严重时会导致 应用卡顿、OOM(内存溢出)或崩溃。资源未释放 Bitmap、Camera、MediaPlayer。✅ 一、LeakCanary(推荐,快速集成,自动分析)无需其他初始化,LeakCanary 会自动开始监控。运行 App,进入可能内存泄漏的界面,然后退出该界面。场景 原因。如果内存泄漏,它会 弹出通知 + 详细引用链。自定义线程、定时器、RxJava 没有释放。

2025-11-30 09:56:07 315

原创 安卓音视频播放

在移动端开发中,音视频播放是非常常见的功能,例如短视频、直播、音乐播放器等。Android 提供了内置的播放方案,但在复杂业务场景下,通常需要第三方播放器来实现更多功能,比如多格式支持、缓存、后台播放、字幕和流媒体播放。[UI交互] -> [Player控件] -> [解码器/ExoPlayer] -> [渲染到SurfaceView/TextureView]ExoPlayer 功能丰富,适合流媒体播放、缓存、字幕和复杂播放需求。全面理解 Android 视频音频播放,从基础方案到第三方库使用。

2025-11-29 09:21:16 221

原创 安卓gradle版本和插件版本对应关系

从 AGP 8.0 开始必须使用命名空间(即 namespace = “xxx” 取代 manifest package)。8.3.1+ 8.4 2.0.0(兼容) Android Studio Iguana(K2 编译器)Kotlin 1.9+ 之后使用了新的 K2 编译器,速度提升但有兼容性变化。✅ Kotlin DSL(build.gradle.kts)用户。Kotlin 插件和 AGP 插件必须配套更新,否则构建会报错。AGP 版本 Gradle 版本 Kotlin 插件版本 说明。

2025-11-29 09:20:56 285

原创 安卓封装jar、aar包

在 permissionlib/build/outputs/aar/ 里会生成 permissionlib-release.aar。推荐这种方式,如果你的 library 需要 app 直接写权限列表。Library 用 api 依赖 XXPermissions。app 也能直接引用 Permission 常量类。🔹 1. 新建 Android Library。这种方式 library 内可以用。直接依赖本地 module。打包成 .aar 分发。

2025-11-29 09:20:34 177

原创 安卓获取存储目录访问与写入

(Android 10+) MediaStore.Images.Media.getContentUri() + RELATIVE_PATH ✅ 通过ContentResolver写入 ❌ 无需权限(但需声明READ_EXTERNAL_STORAGE读取现有文件) ✔️ 自动显示 ❌ 保留 兼容Android 10+的媒体文件存储。应用缓存目录 context.getExternalCacheDir() ✅ 可写但空间有限 ❌ 无需权限 ❌ 不扫描 ✔️ 删除(可能被系统提前清理) 临时文件、缓存。

2025-11-29 09:20:21 146

原创 安卓版本升级功能

Toast.makeText(getContext(), "下载完成,准备安装", Toast.LENGTH_SHORT).show();tvProgress.setText("下载进度:" + finalProgress + "%");Toast.makeText(getContext(), "已取消下载", Toast.LENGTH_SHORT).show();Log.e("HtUpdateDialog", "下载出错:" + e.getMessage(), e);application中添加。

2025-11-29 09:19:37 571

原创 发布代码到jitPack

注意不要在 library 的 build.gradle 中添加 applicationId,它是 library 而不是 App。点击 Look up → 选择 Tag(比如 v1.0.0) → 点击 Get it。整个项目已经上传到 GitHub,包括 app/ 和 mylibrary/ 模块。JitPack 会根据 Tag 构建版本。打开 https://jitpack.io。发布之前,要先把代码上传到github,3️⃣ 在 JitPack 上测试构建。2️⃣ 打 Tag(版本号)

2025-11-28 09:21:32 301

原创 安卓room集成

kapt "androidx.room:room-compiler:$room_version" // Kotlin 必须用 kapt。// 这里1为userId,需要先获取。implementation "androidx.room:room-ktx:$room_version" // 可选,支持协程。// 插入数据(注意不能在主线程,建议放到子线程)// Room 依赖 分为java和kotlin。// 对外暴露获取数据库实例的方法。//kotlin必须 kapt。

2025-11-28 09:21:02 383

原创 安卓mqtt集成

Toast.makeText(this, “收到: “ + message, Toast.LENGTH_SHORT).show();Log.d(TAG, “收到消息: topic=” + topic + “, message=” + payload);Log.d(TAG, “发送消息: topic=” + topic + “, message=” + message);Log.w(“MQTT”, “未知 topic:” + topic);Log.d(TAG, “订阅成功: “ + topic);

2025-11-28 09:20:45 874

原创 安卓获取sha1信息

keytool -list -keystore debug.keystore 去掉-v可以显示sha256。./gradlew signingReport 可直接获取debug和release的sha1。查看 cat cert.pem。

2025-11-28 09:20:10 110

原创 安卓反编译

apktool d /Users/xueqiaoming/allutils/utils/安卓反编译/apks/flight_2.6.14.apk -o ~/Desktop/ddd。你的系统没有安装 wget 工具,可以使用 curl 代替,或者先安装 wget。jadx-gui本质上是一个脚本,它最终会调用java来运行一个.jar文件。✅ 方法一:用 curl 下载 apktool 脚本。mac上 进入bin目录,运行./jadx-gui。✅ 方法二:安装 wget 再执行原命令。

2025-11-28 09:19:22 242

原创 kotlin单例

✅ 语法简单,线程安全,省掉了手动写 static 和锁。在 Kotlin 里,object 定义的类就是 单例。线程安全:初始化本身是线程安全的,不需要额外加锁。不能使用 MySingleton() 创建新实例。工具类(类似 Java 的静态方法集合)val name = "单例"全局唯一:整个程序中只有一个实例。单例模式的对象(服务、控制器等)懒加载:第一次访问时才初始化。所有属性和方法都属于同一个实例。全局管理类(配置、状态管理)3️⃣ 对比 Java 单例。

2025-11-27 09:19:07 192

原创 kotiln顶层函数

Java 调用:UtilsKt.PI / UtilsKt.getCounter() / UtilsKt.setCounter()Kotlin 顶层函数 = 静态工具方法 + 静态属性,可以直接写在文件里,不需要 class 或 static。调用方式(Java):UtilsKt.sayHello("Alice")顶层函数就是直接写在 .kt 文件里的函数,不属于任何类或对象。顶层 val / var 也是静态的,JVM 编译后是静态字段。顶层函数和顶层属性可以放在同一个文件里,集中管理相关工具方法。

2025-11-27 09:18:37 137

原创 安卓autosize屏幕适配

摘要:本文介绍了AndroidAutoSize屏幕适配库的配置方法。首先需在build.gradle中添加依赖(JitPack仓库),然后在AndroidManifest.xml中配置设计图尺寸(dp单位)。通过自定义Application类初始化SDK,可设置日志、适配基准等参数。该库支持dp/sp主单位和pt/in/mm副单位两种适配方案,需注意初始化时机、设计图尺寸配置等要点,并提供了混淆规则。适用于不同屏幕尺寸的Android设备适配需求。

2025-11-27 09:18:25 336

原创 安卓中线程池的创建

Executors 提供的便捷方法:如 newFixedThreadPool、newCachedThreadPool、newSingleThreadExecutor。new ThreadPoolExecutor.CallerRunsPolicy() // 拒绝策略。自定义 ThreadPoolExecutor:灵活配置核心线程数、最大线程数、队列大小、拒绝策略。4, // 核心线程数。8, // 最大线程数。

2025-11-27 09:18:12 726

原创 安卓中用到多线程的地方

在安卓开发中,多线程几乎是随时都会用到的,尤其是涉及 耗时操作 或 异步处理 的场景,否则主线程(UI线程)会被阻塞,导致卡顿甚至 ANR(应用无响应)。多线程的本质目的是避免阻塞UI线程,凡是耗时操作、重复任务或异步事件,都会用到多线程。常用工具:Glide、Fresco、ExoPlayer,本质都是在子线程处理。原因:HTTP 请求、WebSocket、Socket 通信等都是耗时操作。查询、插入、更新大量数据时,操作可能很慢。读写本地文件、图片、视频、大数据文件。倒计时、定时上传数据、心跳包。

2025-11-27 09:17:59 122

原创 单例什么时候会销毁

单例(Singleton)生命周期等于整个进程,如果单例里直接引用了 短生命周期对象(如 Activity、Service、Context 等),在这些对象销毁后单例仍然持有引用,就会造成 内存泄漏。如果单例里引用了 短生命周期对象(Activity、Service),那会导致泄漏,除非手动释放。如果保存了 Application Context,那就和进程同生共死,进程退出才销毁。在 Android 应用进程退出时(系统杀掉应用进程),单例实例才会被回收。“单例”受 容器管理,并不一定等于应用级单例。

2025-11-26 09:17:34 252

原创 安卓设计模式之工厂模式

/ 输出: Android按钮被点击。System.out.println("渲染Android风格按钮");System.out.println("Android按钮被点击");System.out.println("Android文本框");System.out.println("渲染iOS风格按钮");System.out.println("iOS按钮被点击");System.out.println("显示警告对话框");System.out.println("iOS文本框");

2025-11-26 09:17:00 670

原创 安卓设计模式之单例模式

Toast.makeText(appContext, "单例方法被调用", Toast.LENGTH_SHORT).show();if (instance == null) { // 第一次检查。throw new RuntimeException("请使用getInstance()方法");System.out.println("CEO在管理公司");System.out.println("显示运行中的进程");公司只有一个CEO(所有人找CEO办事都找同一个人)

2025-11-26 09:16:40 748

原创 使用liveData实现全局数据自动刷新页面

GlobalData.getInstance().getFlightStatus().postValue(“起飞中”);🧱 第二步:页面中监听数据变化(Activity 或 Fragment)🔄 如果希望多个 Activity 共享 ViewModel 数据?✅ 第三步:在任何地方修改数据,全局生效。🧱 第一步:创建一个公共数据类(单例)

2025-11-26 09:16:19 242

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除