- 博客(240)
- 收藏
- 关注
原创 Kotlin协程详解——withContext函数
虽然能够提供线程的切换,但这只是单方向的,因为它没有提供线程的恢复。试想一下,我们有个网络请求,我们通过将线程切换到,当拿到请求成功的数据之后,所在的线程还是IO线程,这样并不能有利于我们UI操作。所以为了解决这个问题kotlin提供了,它不仅能够接受来帮助我们切换线程,同时在执行完毕之后还会帮助我们将之前切换掉的线程进恢复,保证协程运行的连贯性。这也是为什么官方推荐使用进行协程线程的切换的原因。
2025-02-12 17:18:33
240
原创 kotlin中expect和actual关键字修饰的函数作用
在 Kotlin 多平台编程中,expect和actual关键字用于定义跨平台的抽象和具体实现。这种机制允许开发者声明一个平台无关的接口或函数签名(使用expect),然后在每个目标平台上提供具体的实现(使用actualexpect。
2025-02-12 15:52:17
382
原创 Kotlin协程详解——拦截器ContinuationInterceptor
来创建一个协程(内部具体如何创建的这篇文章先不说,后续文章会单独分析),然后再调用了。既然已经明白了它的拦截方式,我们自己来手动写一个拦截器来验证一下。整体再来看这个例子,它是不是像一个简易版的协程的线程切换呢。所以发生这种情况也就不奇怪了,这是我们拦截的效果。理解是正确的,它可以在协程启动的时候进行拦截操作。结束之后,它内部还会进行一次线程恢复,将自身所处的。类型的实例,才将它加入到拼接链的尾部,对应的就是。因为我们使用的是默认参数,所以这里对应的就是。另外还有一点,如果细心的老铁就会发现,
2025-02-12 15:45:57
635
原创 Android网络框架——OKHttp拦截器
一、Interceptor 的作用二、Interceptor 的类型1. Application Interceptor(应用拦截器)2. Network Interceptor(网络拦截器)3.源码解读三、Interceptor使用
2025-02-12 09:02:23
1244
原创 Android网络框架——OKHttp
OKHttp是一个处理网络请求的开源项目,是安卓端最火热的轻量级框架,由移动支付公司贡献(该公司还贡献了Picasso)用于替代HttpUrlConnection和Apache HttpClient(android API23 6.0里已移除,现在已经打不出来)
2025-02-12 08:50:07
920
原创 Kotlin协程详解——Job
基本上每启动一个协程就会产生对应的Job,例如返回的就是一个Job,它可以用来管理协程,一个Job中可以关联多个子Job,同时它也提供了通过外部传入parent的实现这个很好理解,当传入parent时,此时的Job将会作为parent的子Job。
2025-02-11 16:28:38
540
原创 Kotlin协程详解——组合挂起函数
假设我们在不同的地方定义了两个进行某种调用远程服务或者进行计算的挂起函数。我们只如果需要按 顺序 调用它们,我们接下来会做什么——首先调用 doSomethingUsefulOne 接下来调用 doSomethingUsefulTwo ,并且计算它们结果的和吗?实际上,如果我们要根据第一个函数的结果来决定是否我们需要调用第二个函数或者决定如何调用它时,我们就会这样做。我们使用普通的顺序来进行调用,因为这些代码是运行在协程中的,只要像常规的代码一样顺序 都是默认的。
2025-02-10 19:50:41
254
原创 Kotlin协程详解——协程上下文
协程的上下文,它包含用户定义的一些数据集合,这些数据与协程密切相关。它类似于map集合,可以通过key来获取不同类型的数据。同时的灵活性很强,如果其需要改变只需使用当前的来创建一个新的即可。在协程启动部分提到,启动协程需要三个部分,其中一个部分就是上下文,其接口类型是CoroutineContext,通常所见的上下文类型是CombinedContext或者EmptyCoroutineContext,一个表示上下文组合,另一个表示空。
2025-02-10 19:49:47
1038
原创 Kotlin协程详解——挂起函数的应用和原理
定义:挂起函数是 Kotlin 协程中的一个特殊函数,使用suspend关键字进行标记。特性挂起函数可以在协程中暂停执行,直到某个异步操作完成后再恢复执行。挂起函数不会阻塞调用它的线程,而是让出线程去执行其他任务。挂起函数只能在协程或其他挂起函数中调用。
2025-02-08 17:43:44
1062
原创 Kotlin协程详解——调度器Dispatcher
Kotlin协程提供了多种内置的调度器,如Dispatchers.Default、Dispatchers.IO、Dispatchers.Main等,以及自定义调度器的创建方式,以适应不同的应用场景。通过合理使用调度器,可以显著提高应用的性能。Coroutine使用Dispatchers来负责调度协调程序执行的线程,这一点与RxJava的schedules有点类似,但不同的是Coroutine一定要执行在Dispatchers调度中,因为Dispatchers将负责resume被suspend的任务。
2025-02-08 11:13:28
199
原创 Kotlin协程详解——API函数介绍
Coroutine如何创建呢?有两种方式,分别为launch与asynclaunch: 开启一个新的Coroutine,但不返回结果async: 开启一个新的Coroutine,但返回结果还是上面的例子,如果我们需要执行fetch方法,可以使用launch创建一个Coroutine。
2025-02-08 11:12:12
120
原创 Kotlin协程详解——协程取消与超时
在一个长时间运行的应用程序中,你也许需要对你的后台协程进行细粒度的控制。 比如说,一个用户也许关闭了一个启动了协程的界面,那么现在协程的执行结果已经不再被需要了,这时,它应该是可以被取消的。 该 launch 函数返回了一个可以被用来取消运行中的协程的Job。在实践中绝大多数取消一个协程的理由是它有可能超时。 当你手动追踪一个相关 Job 的引用并启动了一个单独的协程在延迟后取消追踪,这里已经准备好使用 withTimeout 函数来做这件事
2025-02-07 16:54:04
1414
原创 Kotlin协程详解——runBlocking和coroutineScope的区别
runBlocking会阻塞当前线程,这意味着在当前线程执行runBlocking时,其他在该线程上等待的任务将被暂停执行,直到runBlocking内部的协程全部完成。coroutineScope则不会阻塞当前线程,而是挂起当前协程。挂起协程意味着当前协程的执行被暂停,但所在线程可以继续执行其他任务。当所有子协程执行完毕后,当前协程会恢复执行。
2025-02-06 17:46:32
476
原创 结构化并发是什么
结构化并发(Structured Concurrency)是一种编程范式,旨在通过明确的生命周期管理和层次化的任务组织,确保并发操作(如线程、协程等)的可控性和可维护性。它的核心思想是:并发任务应该像结构化编程中的代码块一样,具有清晰的开始和结束,并且父任务必须等待所有子任务完成才能结束。
2025-02-06 13:25:44
352
原创 异步程序设计方式
几十年以来,作为开发人员,我们面临着需要解决的问题——如何防止我们的应用程序被阻塞。 当我们正在开发桌面应用,移动应用,甚至服务器端应用程序时,我们希望避免让用户等待或导致更糟糕的原因成为阻碍应用程序扩展的瓶颈。有很多途径来解决这种问题,包括:线程回调Future、 Promise 及其他反应式扩展协程
2025-02-05 18:58:28
773
原创 Kotlin协程详解——协程基础
你通常会看到 runBlocking 在应用程序的最顶层被这样使用,而在真正的代码中却很少见到它的身影,因为线程是宝贵的资源,阻塞它们是低效的,而且通常是不被期望的。协程遵循结构化并发的原则,这意味着新的协程只能在特定的 CoroutineScope 内启动,该作用域限定了协程的生命周期。这些情况导致的问题是代码间的嵌套层级太深,导致逻辑嵌套复杂,后续的维护成本也要提高,这不是我们所要看到的。协程可以被视为轻量级的线程,但它们之间存在一些重要的区别,这使得它们在实际使用中与线程有很大的不同。
2025-02-05 11:13:45
635
1
原创 多线程详解——IntentService工作原理(源码详解)
是Service组件类的一个扩展,继承自Service,用于按需处理异步请求(以Intent的形式表达),避免IntentService中耗时操作造成主线程ANR,所以IntentService内部创建单独的工作线程HandleThread。客户端通过调用方法发送请求;服务会在需要时被启动,使用一个工作线程依次处理每个Intent,并在没有更多工作要处理时自行停止。这种“工作队列处理器”模式通常用于将任务从应用程序的主线程中获取出来。类的存在就是为了简化这种模式并处理其机制。要使用它,你需要扩展并实现。
2025-01-24 08:00:10
213
原创 kotlin内联函数——let,run,apply,also,with的区别
kotlin中内联函数let,run,apply,also,with的区别
2025-01-23 11:09:44
1210
原创 android四大组件之一——Service
Service 是应用组件,代表一个应用的长时间后台运行的操作,没有交互界面,提供给其他应用一些功能。每个service类必须在清单文件里做 声明. Services可以被启动通过和services像其他应用对象一样,运行在宿主进程的主线程。这意味着,如果你的服务要执行任何CPU密集型(如MP3播放)或阻塞(如网络)操作,它应该生成自己的线程来完成这项工作。有在Processes and Threads中可以找到更多的信息。类作为标准实现类,它有自己的线程可以按部就班的处理事务。
2025-01-11 11:25:39
809
原创 Android详解——ConstraintLayout约束布局
ConstraintLayout继承自ViewGroup,允许用户以更加灵活的方式在布局中设置控件的位置和尺寸(ConstraintLayout在API>9可用)。ConstraintLayout采用方向约束的方式对控件进行定位,至少要保证水平和垂直方向都至少有一个约束才能确定控件的位置。相对位置边距中心位置圆形位置可见性尺寸约束链式布局虚拟辅助控件优化器记住,依赖关系中不能有循环依赖关系。
2024-12-19 13:55:13
2271
原创 多线程详解——HandlerThread工作原理(源码详解)
开启Thread子线程进行耗时操作多次创建和销毁线程是很耗系统资源的。(为什么呢,因为java的线程是依托操作系统,线程的创建和销毁以及频繁切换都涉及到用户态和内核态的切换,以及线程上下文的保存和恢复,所以是比较耗资源的。既然已经有Handler可以实现线程间通信,为什么又设计了HandlerThread?HandlerThread通过字面意思我们可以看到,它是Handler+Thread,那么我们猜测它应该实现了Handler和Thread功能,到底是不是呢,我们向下看。
2024-12-13 14:04:10
1950
原创 多线程详解——AsyncTask工作原理(源码详解)
AsyncTask是对Handler与线程池的封装。使用它的方便之处在于能够更新用户界面,当然这里更新用户界面的操作还是在主线程中完成的,但是由于AsyncTask内部包含一个Handler,所以可以发送消息给主线程让它更新UI。另外,AsyncTask内还包含了一个线程池。使用线程池的主要原因是避免不必要的创建及销毁线程的开销。设想下面这样一个场景:有100个只需要0.001ms就能执行完毕的任务,如果创建100个线程来执行这些任务,执行完任务的线程就进行销毁。
2024-12-12 11:59:48
1304
原创 OpenGL ES详解——glUniform1i方法是否能用于设置纹理单元
需要注意的是,OpenGL允许你同时绑定多个纹理到不同的纹理单元上,并在着色器中通过不同的sampler uniform变量来选择它们。在OpenGL中,纹理单元是图形硬件的一部分,它允许你同时绑定多个纹理,并在着色器程序中通过uniform变量来选择使用哪个纹理。通常,纹理单元通过整数索引来访问,这些索引在着色器中以sampler2D(或其他类型的采样器)uniform变量的形式出现。然后,你需要确保在绑定纹理到纹理单元时,使用与你在着色器中设置的索引相匹配的纹理单元。现在,当你在着色器中访问。
2024-12-11 19:06:48
464
原创 OpenGL ES详解——glTexImage2D作用
glTexImage2D是OpenGL中的一个重要函数,其作用是为2D纹理分配显存并上传数据。
2024-12-11 09:37:58
746
原创 Camera2 API——CameraCaptureSession
CameraDevice的已配置捕获会话,用于从相机捕获图像或重新处理之前在同一会话中从相机捕获的图像。
2024-12-10 07:34:56
379
原创 OpenGL ES详解——YUV数据渲染
YUV是一种图像颜色编码方式。在说 yuv 之前,就不得不说 RGB 图像空间,顾名思义,RGB 是值图像的每一个像素都有 R、G,B 三个值,且三个值一次排列存储;但不一定说一定是按照 R,G,B 顺序排列,也可以是 B,G,R 这样的顺序。其中 R,G,B 的位深为 8 bit。我们常见的图片处理,都是用 R,G,B 的图像格式,比如bitmap,比如图像的存储,基本使用 R,G,B。
2024-12-09 16:59:00
1592
原创 OpenGL ES详解——文字渲染
FreeType的这些度量值中包含了字形在相对于基线上的偏移量用来描述字形相对于此基线的位置,字形的大小,以及与下一个字符之间的距离。当你想要使用不同的字体时,你不得不重新生成位图字体,以及你的程序会被限制在一个固定的分辨率:如果你对这些文字进行放大的话你会看到文字的像素边缘。然而,你的应用程序可能并不需要这么强大的功能,性能更好的点阵字体也许是更可取的。通常这并不会出现什么问题,因为通常的纹理都有4或者4的整数倍的储存大小,但是现在我们只用一位来表示每一个像素颜色,此时的纹理可能有任意内存长度。
2024-12-04 17:01:31
1555
原创 Android opengl 绘制矩形,宽高相同,不能显示为正方形,是怎么回事
通过上述检查和调整,你应该能够找到导致矩形不能显示为正方形的原因,并进行相应的修正。如果问题依旧存在,可能需要更详细地检查OpenGL的渲染管道和具体的代码实现。在Android上使用OpenGL绘制矩形(或尝试显示为正方形)时,如果结果显示为不是正方形,可能有几个原因。
2024-11-29 19:23:53
506
原创 Android shader glsl math方法有哪些举例
在Android的Shader编程中,GLSL(OpenGL Shading Language)被用于实现各种图形效果。GLSL提供了一系列数学方法,这些方法可以在顶点着色器(Vertex Shader)和片元着色器(Fragment Shader)中使用,以实现复杂的图形变换和效果。
2024-11-29 18:52:42
620
原创 android shader gl_Position是几个分量
在Android的OpenGL ES中是一个四维向量,包含x、y、z和w四个分量。这些分量共同决定了顶点的位置和投影效果。是顶点着色器(Vertex Shader)的一个内置输出变量,它用于指定顶点在裁剪空间(Clip Space)中的位置。是一个四维向量(4-component vector),包含四个分量:x、y、z和w。这四个分量共同定义了顶点的位置和相对于观察者的深度(或距离)。的值会被用来确定顶点是否位于裁剪空间内,以及它应该如何被投影到屏幕上。在Android的OpenGL ES中,
2024-11-29 17:39:02
396
原创 GL_TRIANGLE_FAN,GL_TRIANGLE_STRIP和GL_TRIANGLES的区别是什么
独立性:GL_TRIANGLES绘制的三角形是独立的,不共享顶点;而GL_TRIANGLE_STRIP和GL_TRIANGLE_FAN绘制的三角形是相连的,可以共享顶点。顶点使用方式:GL_TRIANGLES按每三个顶点一组使用;GL_TRIANGLE_STRIP根据顶点的奇偶性决定三角形的顶点组合;GL_TRIANGLE_FAN则是以一个顶点为中心,与其他顶点组合形成三角形。适用场景:根据具体需求选择合适的绘制方式,可以在满足需求的情况下提高性能。
2024-11-28 11:55:26
809
android IntentService服务应用举例demo源码
2025-01-24
android组件Service服务应用举例demo源码
2025-01-16
Android OpenGL ES多个纹理实现混叠显示项目源码
2024-12-11
Android OpenGL ES创建绘制YUV格式图片和视频项目源码
2024-12-11
Android OpenGL ES绘制圆角矩形演示demo源码
2024-11-29
Android OpenGL ES多重采样抗锯齿MSAA演示demo源码
2024-11-19
Android OpenGL高级GLSL应用-GLSL的内建变量的使用-绘制顶点功能源码
2024-11-14
Android OpenGL 立方体贴图应用举例-天空盒演示demo源码
2024-11-13
模板测试StencilTest功能应用演示demo源码
2024-11-04
裁剪Scissor功能应用演示demo源码
2024-10-31
RBO渲染缓冲附件关联到FBO演示demo源码
2024-10-30
Android OpenGL Texture纹理附件关联到FBO演示demo源码
2024-10-28
Android OpenGL 图片Texture渲染render 演示demo
2024-10-27
Android OpenGL EBO索引缓冲区对象应用演示demo
2024-10-23
Android OpenGL粒子系统演示demo
2024-10-23
Android OpenGL混合(Blend)半透明功能应用演示demo
2024-10-23
Android OpenGL VAO顶点数组对象应用演示demo
2024-10-23
Android OpenGL VBO顶点缓冲区对象应用演示demo
2024-10-23
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人