- 博客(401)
- 资源 (1)
- 收藏
- 关注
原创 final,static,const差异
Java/Dart中final与static关键字的区别 final和static在Java/Dart中都是常用修饰符,但作用不同: final修饰变量表示引用不可变(对象内容仍可变),保证变量只能赋值一次 static表示类级别成员,不依赖实例可直接通过类名访问 static本身不保证不可变性: static变量可修改(static String url="...") static final组合创建类级别常量(static final String APP_NAME="My
2026-01-05 09:31:50
670
原创 flutter页面不存在了,如果在异步网络请求中的setState还会执行?
Flutter页面销毁后异步请求中的setState问题解决方案 摘要:Flutter页面销毁后,未完成的异步网络请求中的setState仍会执行,导致报错或内存泄漏。本文分析了问题原因并提供了三种解决方案:1) 使用mounted属性判断页面状态;2) 通过dio的CancelToken彻底取消请求;3) 结合自定义标记和dispose方法。同时建议复杂项目使用状态管理工具(如Provider)实现请求与页面解耦。核心思路是在页面销毁时终止异步操作或阻止状态更新,确保应用稳定性。
2025-12-29 09:24:45
460
原创 flutter路由传参接收时机
Flutter中获取路由参数的两种异步方式对比:Future.delayed(Duration.zero)确保在当前帧构建完成后安全获取参数,避免在initState()中直接访问可能未准备好的context;而Future.microtask在微任务队列执行,可能过早触发导致获取失败。前者通过延迟到下一事件循环,保证widget完全构建后再获取参数,是更可靠的做法。两种方式的选择取决于具体场景对执行时机的需求。
2025-12-26 10:00:08
304
原创 flutter构造函数可选参数,必传参数
Flutter构造函数参数传递方式主要有两种:位置参数和命名参数。位置参数(如ChannelItem(this.channelItem))必须按顺序传递,调用时不带参数名。命名参数(如ChannelItem({required this.channelItem}))必须使用参数名传递,调用更灵活且可读性强。位置参数适用于简单场景,命名参数则更适合多参数或需要明确参数含义的情况,能提高代码可维护性。两种方式各有优势,开发者可根据实际需求选择。
2025-12-25 16:30:00
269
原创 对比kotlin和flutter中的异步编程
Kotlin与Flutter异步编程对比:Kotlin基于协程实现多线程并行,支持线程调度和共享内存,适合复杂后台任务;Flutter采用Dart单线程事件循环模型,通过Isolate实现多线程隔离,UI更新更安全。Kotlin提供Flow处理数据流,支持背压控制;Flutter使用Stream管理持续数据。Kotlin异常处理更灵活,Flutter需谨慎捕获避免Isolate崩溃。两者分别适用于Android原生开发与跨平台UI场景,核心差异体现在线程模型、并发机制和异常处理策略上。
2025-12-19 17:08:57
523
原创 Instrument 这个词是怎么发展过来的
摘要: Instrument 源自拉丁语 instrumentum(工具),经古法语传入英语,核心义为“工具”,后扩展为“乐器”(音乐工具)、“手段”(抽象工具)及“法律文书”(执行工具)。其衍生词(如 instrumental)进一步丰富语义。同源词 instruct(教导)与 construct(建造)均基于拉丁词根 struere(建造),但因前缀差异而分化:instruct 强调知识或指令的“内部构建”,而 construct 侧重实体或理论的“组装构建”。二者在词性、搭配及语域上均有显著区别。
2025-12-19 10:56:35
874
原创 kotlin中livedata和Flow的区别
本文对比了Kotlin中LiveData和Flow的数据发送机制。LiveData通过setValue(主线程)、postValue(异步)和emit(协程)发送数据,强调生命周期感知和主线程安全;Flow则通过emit(挂起)、emitAll(合并流)、tryEmit(非挂起)和StateFlow.value等方式发射数据,基于协程支持背压和灵活线程控制。核心区别在于:LiveData绑定主线程和生命周期,适合简单UI更新;Flow支持冷热流和复杂异步场景,更灵活但需手动处理生命周期。建议新项目优先使用F
2025-12-19 10:43:08
468
原创 kotlin冷流热流的区别
摘要:Kotlin中LiveData和Flow是Android异步数据处理的核心工具。LiveData提供主线程同步的setValue、异步的postValue和协程扩展emit方法,具备生命周期感知但仅支持主线程操作。Flow则通过emit、emitAll等挂起函数实现数据发射,支持背压和线程切换,包含冷流/热流两种模式。二者主要区别在于线程模型、生命周期感知、背压支持等方面。建议UI状态更新使用StateFlow,异步请求使用冷流Flow,事件分发使用SharedFlow,旧代码兼容可使用LiveDat
2025-12-19 10:40:41
758
原创 flutter setState(() { … }) 作用
Flutter中setState()是触发UI更新的核心方法,必须将状态修改包裹其中才能有效更新界面。其原理是标记State为"dirty"并触发下一帧重建。使用时需注意:仅在StatefulWidget中使用、避免耗时操作、异步操作前检查mounted状态。常见错误包括直接修改状态不调用setState、在build方法中调用导致循环等。虽然高级状态管理工具可以减少直接使用setState,但理解其作为Flutter响应式编程基础的机制仍很重要。正确使用口诀:"改状态,包se
2025-12-18 00:19:55
313
原创 视觉模型和语聊模型异同
视觉分类模型(如ResNet、ViT)与语言模型(如BERT)的核心原理高度相似,均遵循"输入→编码→解码→输出"的统一范式。两者都将原始数据(图片/文字)转化为向量,通过神经网络提取特征(视觉层级特征/语义特征),最终基于特征向量进行分类决策。关键差异在于:图片是空间结构化数据,采用CNN/ViT提取局部到全局的特征;文字是序列数据,通过Transformer建模全局语义关联。近年ViT证明Transformer可统一处理两种数据,进一步验证了"向量化+特征提取+概率决策&q
2025-12-05 15:11:33
641
原创 W_q,W_k,W_v矩阵是怎么确定的?
摘要:Transformer模型中的W_q、W_k、W_v矩阵是注意力机制的核心可学习参数,通过数据驱动的反向传播优化确定。其本质作用是将输入映射到查询、键、值空间进行特征提取。确定流程包括随机初始化(如Xavier)、训练优化(前向传播计算损失,反向传播更新参数)和最终收敛。这些参数受数据质量、模型结构(如多头注意力)、训练超参数和任务目标影响。人工无法设定这些参数因其需要捕捉复杂的语义特征,而端到端学习能自动发现深层规律并实现泛化。最终确定的参数矩阵编码了输入数据的语义映射关系。
2025-12-03 10:20:14
989
原创 张量=多维数组?
摘要: 张量(Tensor)是深度学习框架中的核心数据结构,本质上是带计算属性的多维数组,与普通多维数组的关键区别在于其附加的元信息: 设备信息(CPU/GPU)实现硬件加速; 数据类型(如float32)优化计算精度; 梯度追踪(requires_grad=True)支持自动微分; 计算图关联实现高效反向传播。 这些属性使张量能够动态参与模型训练与推理,而普通数组仅为静态数据容器。例如PyTorch中,张量通过device、dtype等参数封装计算逻辑,成为深度学习的高效计算单元。 (字数:149)
2025-12-02 10:14:38
359
原创 词嵌入中语料库矩阵和句子矩阵是怎样的?
摘要:本文介绍了词向量表示的基本原理。首先通过语料库矩阵E将词语转化为128维向量,再通过句子矩阵V进行One-Hot编码表示词语位置。将E与V相乘可得到句子的嵌入向量。这种方法相比传统表示具有三大优势:1)用低维向量高效表示高维特征;2)通过向量距离反映词语语义相似度;3)预训练的词嵌入矩阵可迁移到不同任务。整个过程实现了从离散符号到连续向量的转化,为自然语言处理提供了数值计算基础。
2025-12-01 17:31:16
312
原创 kotlin协程编译成Android字节码后是什么样的
Kotlin协程在Android中的实现原理是通过编译器将协程转换为状态机和回调机制。挂起函数会被编译为带Continuation参数的函数,使用状态机管理执行流程。协程体被转换为匿名内部类,通过label字段跟踪执行状态。调度器映射为Android原生线程机制,如Dispatchers.Main基于Handler实现。协程本身不创建线程,而是通过状态机切换和线程调度实现异步操作,在字节码层面表现为CPS转换后的回调链和状态管理。
2025-12-01 14:30:37
767
原创 TCP/IP协议中的序列号和确认号在握手和挥手中的具体作用
摘要:序列号(Seq)和确认号(Ack)是TCP连接可靠性和有序性的核心机制。三次握手中,它们用于初始化和确认双方的初始序列号(ISN),确保连接可靠建立。四次挥手中,它们确认数据传输完整性并有序关闭连接。ISN使用随机值而非固定值,防止历史连接干扰导致数据混乱。详细流程中,Seq表示发送的起始序列号,Ack则是期望收到的下一个序列号,FIN和SYN报文均占用序列号。这种设计有效保障了TCP连接的可靠性和唯一性。
2025-11-20 10:05:01
586
2
原创 TCP三次握手与四次挥手的过程与意义
TCP连接建立需要三次握手,确保双方都能收发数据:1)甲方发起请求;2)乙方确认并发起请求;3)甲方再次确认。断开连接需要四次挥手:1)甲方请求断开;2)乙方确认;3)乙方完成收尾后请求断开;4)甲方确认。多一次确认是因为双方需各自独立完成通信收尾。三次握手确保双向通信可靠,四次挥手保证双方都能妥善结束连接。
2025-11-18 10:53:04
259
原创 Retrofit的设计目的(适合有一定了解的user)
Retrofit是一个类型安全的HTTP客户端,通过动态代理和注解简化了Android/Java应用的网络请求处理。其主要特点包括类型安全、易用性、高性能和扩展性。核心组件包括Retrofit类、ServiceMethod、CallAdapter和Converter。Retrofit 2.6.0+原生支持协程,通过suspend函数自动处理线程切换和异常。使用动态代理创建接口实例(如retrofit.create(ApiService::class.java)),实现声明式API设计,业务代码只需定义接口而
2025-11-14 12:06:04
764
原创 kotlin suspend是如何做到不阻塞线程,但等待挂起代码返回结果再往下执行的?
Kotlin协程通过状态机转换、CPS转换和回调机制实现非阻塞异步编程。编译时将协程代码转换为状态机,每个挂起点对应一个状态。CPS转换通过Continuation传递控制流,使挂起函数接收回调参数。底层使用回调机制在异步操作完成后恢复执行。这三种机制协同工作,既保持了同步代码的编写风格,又实现了线程非阻塞的效果,同时自动管理执行状态。
2025-11-13 10:38:14
302
原创 Java中为什么有key value的结构叫做map
摘要:Java中的Map名称来源于数学中的"映射"概念,表示键值对的对应关系。Map比Dictionary、Table等命名更抽象通用,符合面向接口编程思想。虽然"map"本义是地图,但通过从具体到抽象的演变,引申为建立对应关系的含义。不同语言对类似结构有不同命名(如Python的dict),但Map已成为主流编程术语。这种命名体现了精确、抽象的程序设计哲学,将数学概念直接应用于数据结构设计。
2025-10-31 09:54:58
924
原创 kotlin协程踩坑
摘要:本文探讨了在Kotlin协程中处理同步耗时网络请求的方法。通过分析getIPAddress()同步方法在不同线程环境下的表现,发现直接在主线程调用会因阻塞导致获取不到IP值。使用withContext(Dispatchers.IO)将耗时操作放在IO线程执行,既能保持代码的同步书写风格,又不会阻塞主线程。协程通过挂起机制实现"看似同步,实则异步"的效果,等待IO操作完成后再继续执行后续代码,解决了位置一无法获取IP值的问题,同时避免了ANR风险。
2025-10-29 18:00:39
785
原创 人工智能的本质是什么
本文介绍了机器学习的分类原理和方法。核心思路是通过函数f(x)逼近已知的输入输出数据。方法包括:1)线性函数调整权重和偏移量;2)直接求解规则;3)计算机自动调整逼近。当线性函数无法拟合时,可加入非线性激活函数(如平方、sin等)增强拟合能力。对于多输入情况,可通过"套娃"式叠加神经网络层来构建复杂函数,理论上可逼近任意函数。神经网络的本质就是通过多层结构找到最优的权重w和偏移量b,最终实现分类目的。
2025-10-16 14:53:32
309
原创 机器学习,深度学习,神经网络,Transformer的关系
名称层级关系典型应用机器学习最大范畴包含深度学习推荐系统、风控、预测深度学习子集基于神经网络图像识别、语音识别神经网络工具深度学习的实现方式架构一种先进的神经网络大语言模型(GPT、BERT)🎯最终结论所有都是神经网络所有神经网络都属于深度学习所有深度学习都是机器学习的一部分。而今天最火的 AI(如 ChatGPT、文心一言、通义千问),它们的“心脏”就是Transformer 架构的神经网络它们属于深度学习,也是机器学习的巅峰之作。
2025-10-16 10:44:14
1064
原创 kotlin 为什么要有协程作用域
在 Kotlin 中,协程是轻量级线程,但它们并不会自动和某个生命周期(Activity、ViewModel 等)绑定。如果你直接用 ,协程会一直运行,除非任务结束或进程退出,这就可能造成:所以需要 CoroutineScope 来约束协程的生命周期。来自 ,当 销毁时自动取消协程,适合做网络请求、数据库操作。来自 ,和 Activity/Fragment 生命周期绑定,适合 UI 层。自定义作用域4. 如果没有作用域会怎样?协程失控:你无法控制它的生命周期。很难写出可预测、稳定的程序
2025-09-22 14:36:18
516
1
原创 Android开发网络框架的演进和封装
Android网络框架经历了从HttpURLConnection到OkHttp再到Retrofit的演进过程。OkHttp通过连接池管理、自动重连等特性提升了性能,而Retrofit进一步简化了RESTful API调用。建议采用分层封装策略:单例管理Client、统一API服务、封装请求处理、使用拦截器。具体实现时需添加OkHttp、Retrofit等依赖,建立网络相关包结构,并合理运用Kotlin协程等现代特性。良好的网络层封装能提升代码复用性、降低耦合度,是现代Android开发的重要实践。
2025-09-10 10:12:27
919
原创 android 不同分辨图片放错对应文件夹会怎样?
本文系统讲解了Android多分辨率适配机制。首先介绍了drawable目录的分级标准(mdpi、hdpi等)及其对应的dpi值,解释了如何为同一UI元素准备不同像素密度的图片。重点分析了两种图片错放情况:大图放小目录会浪费内存但不影响显示,小图放大目录会导致模糊。详细说明了Android选择图片资源的流程,包括系统如何根据设备dpi自动选择最优资源,以及资源缺失时的处理策略。最后总结指出,应为主流density提供适配图片,推荐使用矢量图,同时强调不必过分纠结技术细节。全文为Android开发者提供了清晰
2025-08-29 11:45:12
1020
原创 flutter一些值得注意的地方
这篇文章介绍了Flutter开发中的几个实用技巧:1) 区分Image控件加载网络图片和本地文件的不同写法;2) 两种并行解密文件并更新URL的方案,使用Future.wait提高效率;3) 对比then和onComplete回调的差异,强调后者能更精准控制异步回调时机。这些技巧对优化Flutter应用的性能和异步处理很有帮助。
2025-08-28 15:42:03
128
原创 flutter Function和自定义的Callback有什么区别?
摘要:Function与自定义Callback的主要区别在于类型安全性和明确性。Function是通用类型,缺乏参数约束和IDE提示;自定义Callback通过typedef定义,明确参数和返回值,提高代码可读性和安全性。改进建议:定义BookLoadCallback等具体类型替代Function,使代码更健壮、易维护,同时获得更好的IDE支持和编译时检查。
2025-08-28 15:21:27
252
原创 then和callback有什么区别,then不是异步的吗?为什么只能用callback监听才行?
摘要: then()只监听Future完成,而Function? onComplete自定义回调能确保所有嵌套异步操作真正完成。关键区别在于getBookInfoFromLocal()内部存在递归和多个异步阶段,then()可能过早触发。使用回调参数可精确控制执行时机,确保下载、解压、数据库查询等所有操作完成后再执行后续逻辑,避免竞态条件。回调方式在复杂异步场景中更可靠。(150字)
2025-08-28 15:15:59
253
原创 Android Studio注释如何不从行首开始
在IntelliJ IDEA中设置Java和XML注释格式:1) 进入File→Settings→Editor→Code Style;2) 对于Java注释:选择Java→Code Generation,取消勾选"Line comment at first column",勾选"Add a space at comment start";3) 对于XML注释:选择XML→Code Generation,取消勾选"Line comment at first c
2025-08-12 17:38:48
315
原创 Flutter 页面跳转及传参总结
Flutter页面跳转与跨平台通信方法总结: Flutter内部跳转: 基础跳转:通过Navigator.push()和构造函数传参 命名路由:使用Navigator.pushNamed()配合路由表,通过arguments传参 返回数据:用Navigator.pop()返回数据,await接收 Flutter与Android交互: Flutter→Android:通过MethodChannel发送跳转指令和参数,Android端解析后启动Activity Android→Flutter:原生调用Metho
2025-07-31 17:13:11
582
原创 Flutter module 是如何被原生 Android 项目通过 Gradle 引入的
场景推荐方式项目中只用一个 Flutter 页面使用多个 App 共用 Flutter UI用生成 AAR 离线包高频原生 ↔ Flutter 通信需求配置 MethodChannel / EventChannel。
2025-07-31 15:33:20
471
原创 Gradle 版本与 Android Gradle Plugin 版本对应关系
Android Gradle插件与Gradle版本兼容性对照表展示了从3.0.x到8.0.x版本的对应关系,并标注了适配的Flutter版本。随着Gradle版本升级,配置文件逐步从Groovy脚本转向Kotlin DSL,构建脚本结构也发生变化:从传统的buildscript配置到7.x时期的插件管理块,再到8.x时期的plugins{}块和集中式依赖管理。同时,仓库配置从jcenter迁移到mavenCentral,Kotlin支持不断加强,体现了Android构建工具向现代化、标准化发展的趋势。
2025-07-31 15:15:07
1431
原创 kotlin中withContext,async,launch几种异步的区别
Kotlin 协程中的 withContext、async 和 launch 各有特点:launch 用于无返回值的并发任务;async 适合并发执行多个任务并获取结果;withContext 则用于切换线程执行单一任务并返回结果。推荐:单一任务用 withContext,多任务并发用 async,不关心结果时用 launch。例如网络请求可优化为 withContext(Dispatchers.IO),比嵌套 async.await 更简洁。
2025-07-10 15:09:30
753
原创 Android开发中几种scope的对比
Kotlin协程Scope对比指南 Android开发中,不同CoroutineScope的生命周期管理差异显著: 1️⃣ GlobalScope:进程级别,需手动cancel,易内存泄漏; 2️⃣ viewModelScope:绑定ViewModel生命周期,自动取消,推荐用于UI异步任务; 3️⃣ lifecycleScope:关联Activity/Fragment,组件销毁自动清理; 4️⃣ MainScope:需手动管理,适用于非ViewModel的UI逻辑; 5️⃣ Hilt兼容:viewMode
2025-07-10 14:49:34
648
原创 vscode打开的文件被覆盖/只能打开两个文件(Visual Studio Code)
其他如果你调整过settings.json的自己去搜索这个的设置方法吧,一般人是不会动这里的,祝好!单击代码文件:是预览模式,只会显示有限的一两个文件,在一个tab里更新显示。双击代码文件:是编辑模式,可以同时显示多个代码文件的tab。
2025-05-21 10:27:40
1045
原创 flutter缓存网络视频到本地,可离线观看
在Flutter应用中实现网络视频缓存并支持离线观看的过程包括以下步骤:首先,调整视频播放组件,确保能够处理网络和本地视频的播放。其次,引入flutter_cache_manager依赖,用于管理视频缓存。通过CustomVideoCacheManager类配置缓存策略,如最大缓存数量和缓存保留时间。接着,在视频播放组件中实现缓存逻辑,通过getFileFromCache方法获取缓存文件,并使用DataSource类根据网络状态选择播放源。最后,封装异步逻辑,确保在缓存文件可用时播放本地视频,否则从网络加载
2025-05-16 16:40:48
1189
1
原创 singleInstance 和 singleTask的 重要 区别
和singleTask是 Android 中 Activity 的两种启动模式,它们主要用于控制 Activity 在任务栈中的行为。
2025-03-18 16:34:10
715
原创 flutter页面跳转
以上就是 Flutter 官方标准用法之一,但可以根据需求优化或选择更合适的方式。,Flutter 还提供了多种跳转方法,具体选用哪种方式取决于需求。如果不想让用户返回上一个页面(例如登录成功后进入首页),可以用。
2025-03-05 12:07:54
411
原创 玩转斐讯K3详细刷机——直接刷LEDE
我这里用的是LEDE,网上好多人说要用啥过渡的固件,我就没有用,就直接刷到最新版本的,反正刷不成功再刷呗,这玩意就是一个小嵌入式而已,没啥高深的地方。14、把本机的网络适配器IP改为自动获取的,然后打开浏览器,地址栏输入192.168.1.1,就可以进入刷机后的路由器后台,要是刷LEDE,用户名就是root,密码是password。8、等待差不多出现6个TTL=100后,打开火狐浏览器的隐私窗口,主要是因为隐私窗口不会缓存,不会有cookie记录等麻烦事,否则有时候打不开,需要清理缓存这些工作。
2024-11-07 11:27:15
7518
原创 K3梅林系统 强制刷机方法
对于梅林系统升级过过程中出现的无限重启卡屏的解决方案黄色字体对应于K3 目前机器主要分成两个关键步骤:第一、进CFE;第二、用TFTP传入文件进行刷机。1硬件网线直接连接K3路由LAN口。2带有无线网卡的电脑需要屏蔽掉无线网卡,直接用有线网卡连接路由器进入网卡设置,固定IP地址为192.168.2.2 (192.168.50.2,192.168.100.22其中之一,多尝试)网关相对应设置为192.168.2.1 (192.168.50.1,192.168.100.1)
2024-11-07 01:50:38
5516
Julia中文文档.pdf
2020-09-02
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅