- 博客(26)
- 收藏
- 关注
原创 C语言-语法
高级语言里面虽然没有指针,但是我们对指针的概念其实并不陌生。我们在Java中都知道对象的引用的概念,在方法中声明一个对象,会在栈中存放一个引用,而这个对象是保存在堆内存中的,栈中的引用会指向堆内存中的对象。其实这个引用就类似于指针的意思,只不过引用可以直接操作对象。高级语言中不区分这两种概念,统一使用引用的概念。严格的说,C语言中的指针类型,其实就是指保存的值是内存地址的变量。在声明结构体变量的时候,编译器就为其分配内存空间结构体在内存中的分布,是一片连续的内存空间。
2025-03-08 22:31:20
612
原创 CoordinatorLayout使用详解
的高级功能在于你可以自定义控件的行为。比如,监听滑动事件,然后让某个控件做出反应。示例:自定义悬浮按钮(FloatingActionButton)的行为假设我们希望悬浮按钮在滑动时隐藏,但隐藏的时机和默认行为不一样。我们可以自定义一个Behavior// 当开始滑动时,这个方法会被调用axes: Int,type: Int// 我们只关心垂直方向的滑动// 当滑动发生时,这个方法会被调用type: Int,) {// 如果向上滑动,隐藏按钮;如果向下滑动,显示按钮。
2025-01-24 13:13:38
795
原创 VLayout使用及原理
Override// 检查是否还有更多子项需要布局// 尝试获取下一个子项break;// 如果没有子项,退出循环// 测量子项并计算布局位置// 更新布局状态(例如消耗的空间)// 检查是否超出可用空间break;// 如果超出可用空间,退出循环@Override// 获取适配器的子项总数@Override// 返回 false,表示需要手动布局。
2025-01-24 12:52:11
335
原创 Flutter中Key的作用
Flutter开发中经常碰到一种现象,当我们调用setState更新UI时,StatefulWidget状态会莫名其妙显示错误。适用于同一父级下需要区分不同实例的场景。:当你有一个复杂的对象,并且希望根据这个对象来区分。在这种情况下,如果相同类型的。:当你需要区分同一父级下的多个相同类型的。,这样 Flutter 在更新时会根据。都相同,Flutter 会直接复用。:每次创建时都会生成一个独一无二的。时,Flutter 会在整个。:当你希望每次更新时都强制刷新。仍然会复用之前的实例,导致。
2025-01-23 16:08:34
842
原创 Android并发相关知识点
它通过引入一个**版本号(Stamp)**来区分变量值的变化,即使变量值从A变回A,版本号也会发生变化。,主内存是所有线程共享的内存,工作内存是每个线程私有的内存。线程对变量的操作都在工作内存中进行,锁的作用就是将线程工作内存的变量进行同步。CAS是一种用于实现无锁编程的机制,通过比较预期值来更新变量,确保操作的原子性。CAS机制的核心在于确保操作的原子性,避免了传统锁机制的开销,同时提高了并发性能。等待一个线程终止,常用于一个线程等待另一个线程完成任务。方法实现了CAS机制。类的方法,用于线程间的通信。
2025-01-20 23:48:05
784
原创 架构基础-泛型
我们看到第十行代码确实是把ArrayList的泛型擦除了,但是却在LocalVariableType里面对我们的泛型进行了记录,也就是说字节码并没有真正的擦除我们的泛型,我们依然可以通过字节码获取到泛型信息。获取方法返回值泛型等方法,其他的位置的泛型我们可以通过字节码工具javasssist等获取。当我们执行上面一段代码,可以看到不同泛型的两个ArrayList的Class是相同的,看起来好像泛型从我们的字节码抹除掉一样。方法我们却能拿到父类的泛型信息,那泛型是否真的在我们的字节码擦除了呢?
2025-01-19 23:44:23
235
原创 HandlerThread和IntentService
这种方式可读性更高,使用也相对简单,也是我平时单线程切换最常用的方式。的封装也非常简单,主要用来在后台异步完成一些耗时任务,所以继承自。线程中,这样就能完成线程的切换。来处理异步任务,异步任务处理完成后会结束服务。,在服务创建的时候会创建一个并启动。实现线程切换效果是一样的,相比。信的时候就能直接拿到这个。
2025-01-19 23:34:15
300
原创 蓝牙通信详解
Android手机间通过蓝牙方式进行通信,有两种常见的方式,一种是socket方式,另一种是通过GattServer(Android5.0以后)通信,socket方式最为简单,但是很多低功耗的蓝牙设备,如单片机上的蓝牙模块可能不支持;而Gatt方式相对比较复杂。其实无论是socket方式还是Gatt,Android设备间蓝牙通信都是一种C/S(client-server)模式。本文基于两种通信方式,进行详细展开,并推荐了开源项目,建议配合学习。蓝牙4.0是以参数来进行数据传输的,即服务端定好一个参数,
2025-01-19 22:08:55
829
原创 Kotlin协程详解
定义挂起函数delay(1000)//模拟耗时的网络请求return"数据"在协程中调用挂起函数只能在协程或其他挂起函数中调用挂起函数。datavaldata=fetchData()println("获取到的数据:$data")}调用fetchData时会挂起协程,延迟一秒后获取到数据并打印。
2025-01-19 21:46:09
620
原创 网络协议详解
SSL/TLS协议自动实现了加密传输过程,只要使用的证书是由受信任的证书颁发机构(CA)签发的,这一过程就会自动进行。理论上,中间人攻击中是难以被篡改请求的,因为伪造的证书在客户端证书校验过程中通常会被识别并拒绝。但是,如果客户端的证书验证机制存在漏洞或被绕过(例如信任所有证书),伪造的证书仍有可能通过校验,从而导致安全风险。而UDP则会直接丢弃丢失的数据包,继续传输后续的数据,虽然可能会出现一些画面的轻微抖动或音频的短暂中断,但整体的流畅性更好。使用UDP可以减少延迟,使得游戏的交互更加流畅。
2025-01-19 18:49:28
792
原创 Flutter各种Key到底是干嘛的?
Flutter开发中经常碰到一种现象,当我们调用setState更新状态时,状态会莫名其妙的丢失,比如下面的例子:首先定义一个有状态的盒子,盒子显示一个随机数字@override@override显示一个绿色盒子和一个蓝色盒子,点击按钮将蓝色盒子放到前面@overridebody: Row(),),从图中我们看到蓝色盒子确实移动到前面,但是盒子中显示的数据却出现了问题。
2025-01-01 22:11:34
706
原创 Flutter打包命令详解
Flutter打包是通过打包命令来完成的,但是官网以及网上资料最打包介绍的却少之又少,本文详细介绍打包命令各种 标志 的含义,从此打包将不再一头雾水。如果觉得有收获的话,不要白嫖!
2025-01-01 22:10:25
1280
原创 Flutter插件开发流程
在 Flutter 项目的开发中,我们需要根据自己的业务需求来创建各种各样的插件,这里记录下关于 Flutter 插件的创建及使用的过程。
2025-01-01 22:09:01
676
原创 Flutter布局约束
Flutter进行布局时,上层 widget 会向下层 widget 传递一个尺寸约束,下层 widget 不能违反父级尺寸约束。当子级约束和父级约束有冲突时,子级约束无效,按照父级约束。(爸爸说的才算数。。。😂)
2025-01-01 22:05:31
713
原创 AIDL源码分析
Android 接口定义语言,利用它定义客户端与服务均认可的编程接口,以便二者进行进程间通信 (IPC)。AIDL 使用实质就是对 Binder 机制的封装,主要就是将远程服务端的 Binder 封装成一个代理对象 Proxy,从用户的角度看,就像是客户端直接调用了服务端的代码。
2025-01-01 21:51:22
843
原创 Messenger源码分析
Messenger(信使) 是一种跨进程通信实现方式,是对 AIDL 的进一步封装,省去了两端创建 AIDL 的过程。
2025-01-01 21:50:13
173
原创 Handler源码分析
如果消息此刻到时间了,返回msg。取出消息时,从队列取第一个消息作为待发送的消息,如果该消息是障碍消息,则取队列中第一个异步消息作为待发送的消息。通过上面的分析我们知道,当我们在A线程调用Handler发送消息,在B线程调用Looper.loop(),不断从MessageQueue中取出消息分发到Handler,所以消息处理是在B线程,这就完成了消息线程的切换。插入消息时,首先找到比发送消息触发时间小的最后一个消息,将靠前消息的next赋值成当前的消息,当前消息的next赋值靠前消息的next。
2025-01-01 17:38:50
676
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人