自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Kotlin协程Flow特性之StateFlow与SharedFlow

学过Flow可以知道,这是一种冷流,就是订阅者使用的时候,flow发出的流才会保存在内存当中,这种模式更适合一些连续的,不变的的数据传输(已知),但是,我们在实际中可能需要可变的、实时更新的数据,这就需要使用StateFlow,与LiveData类似,StateFlow通常与视图相关联,并且在视图的生命周期内保持活动状态,(是一种热流,存在内存中,时刻保持活跃),还能通过value属性读取当前状态值SharedFlow:功能类似广播,只是性质不一样,简单来讲就是一个流可以被多个收集到,也是一种热流。

2024-05-01 16:36:16 60 2

原创 在Fragment使用RecyclerView(附代码)

讲讲为什么这么设置,主要是因为你有展示一列一列数据的时候,这时候你可以在Fragment中内嵌RecyclerView,其中的具体实现由item_product实现即可。详细看代码吧,多说无益。

2024-04-22 22:33:01 655

原创 Jetpack的DataBinding的使用(附代码)

系统学一下Databinding, 简单来讲就是将视图ui和数据进行绑定的组件,这里我们使用ViewModel来进行触发事件的管理和数据的载入,在布局文件中进行Databinding的数据绑定,例如使用@{}表达式,万事俱备,这时我们发现还有布局文件的管理者MainActivty,在那里进行声明就可以了,创建出binding 进行布局、ViewModel、lifecycle的绑定,想知道具体内部的关联,感兴趣的可以看看源代码实现,特别是lifecycle的绑定这里,借用了观察者模式,来进行实时更新。

2024-04-17 21:37:45 448 1

原创 Kotlin使用Room来实现一个注册登录功能

一个app,注册登录功能是比较基本的服务,一般会使用阿里云来保存后台登录数据,这里为了巩固Room的学习,继续使用该模式来设计,实现简单的登录注册功能。思路:就是没有账号先注册账号,注册完成后会跳转到登录页面进行登录,凡是错误的登录信息都会报错,登录完成将跳转到主页面。提示:以下是本篇文章正文内容,下面案例可供参考。

2024-04-16 21:34:18 545

原创 Jetpack组件Room的学习使用(附代码)

以前学过Room的设计模式,但是有关细节处理方面有些忘记了,比如一些注解为何这样写什么的,现在我忘记了还真答不上来,在这里重拾一下过去的知识,以便更好的学接下来的有关Room进阶的知识。还是要多复习,多练练一些细节,不懂的多查查,特别官网上的最新解释,有时能解释你的困惑,有安卓方面的大佬可以多指点一下我这个菜鸟。

2024-04-11 22:25:59 1983

原创 Kotlin协程Flow与文件下载(附代码)

项目的前期准备工作已经在另一文章完成,主要是使用Jetpack的 Navigation 组件来完成一些UI工作,下面来实现具体的协程Flow与文件下载的工作。

2024-04-10 18:00:39 1467 1

原创 Android Jetpack的 Navigation 组件(学习笔记)

Navigation 是 Android Jetpack 中的一个组件,旨在简化 Android 应用程序中的导航和屏幕间的交互。它提供了一种简单而强大的方式来管理应用程序中的导航,包括屏幕之间的导航、深链接和动画等。

2024-04-08 22:01:55 521

原创 Kotlin协程并发安全问题

例如,线程 A 持有资源 X,等待资源 Y,而线程 B 持有资源 Y,等待资源 X。一个数据98进行了++,还没进行内存的数据修改(理应写入99),但这时一个新的协程已经开启,将这个数据进行++(还是得到98++),那上次数据的++将没有得到实现。我们协程是基于线程的,线程出现的安全问题,协程也难免会出现,特别是Java平台上的Kotlin协程实现免不了存在并发调度的问题。当多个线程或协程同时访问共享的可变数据,并且至少有一个线程进行了写操作时,可能导致未定义的行为或不一致的结果。

2024-04-07 20:40:31 699

原创 Kotlin协程用Channel实现多路复用与selectClause

协程的多路复用的方法有很多,比如使用await、Channel、Flow都能进行多路复用,这里是进行多个复用的时候就会有先后顺序,协程会使用Select来进行挑选,谁先进来就谁先展示。我们以SelectClause0为例。现在job1和job2没有返回值,select收集他们时,现在调用的job1.onJoin函数对应的参数就是SelectClause0。就是一个信道足够大,可以容纳多个信号,这时可以采用多路复用技术来加快效率。根据协程通道复用的概念,可知channel[0]发射的更快,将最先接收。

2024-04-07 17:13:34 260

原创 Kotlin协程Channel(通道)

可见,在关闭的时候,只接收到0,而1,2没有接收到,所以CloseForSend: true CloseForReceive: false,等到1, 2也被接收的时候 CloseForReceive也为true了。通道可以被看作是生产者-消费者模式的实现,其中一个协程可以发送数据到通道,而另一个协程则可以从通道接收数据。热流的特点是,数据流在创建后立即开始,不受订阅者的影响,而Flow。是一种冷流,这意味着它的数据流在没有订阅者时是不会启动的。就字面意思,上面讲的很清楚了,我用一个事例代码解释一下。

2024-04-01 10:29:34 1324

原创 Kotlin协程Flow的异常处理与完成处理

这样可以更好地控制流的行为,并在异常发生时采取适当的措施,例如日志记录、默认值提供等。就是说上流这种设计模式只是想捕获到异常然后更好的处理流上层的问题,由于收集阶段是在调用流的地方,可能有不同的上下文和需求,因此在这里使用。假如你使用try-catch的话,不仅臃肿,而且也没必要,不适合上层流构建的设计模式。操作符允许您访问到流完成时的异常信息(如果有的话),并且可以选择性地处理异常信息,块中的代码将在流完成后执行,无论是正常完成还是异常完成。:在流的创建阶段,使用。:在收集流的时候,使用。

2024-03-31 16:48:54 579 2

原创 Kotlin协程中Flow的常见操作符

对流中的每个元素应用给定的转换函数,并返回转换后的结果流(经过map内的操作后才成为结果流)。如下面为例,将Int类型转换为String类型,但这只是简单的映射函数操作,想要更复杂的处理需要使用transfor.transform是Flow中的一个操作符,它允许你对流中的每个元素进行转换,并且每个元素可以映射到一个新的流。而且每个输入元素可以产生零个、一个或多个输出元素(使用emit十分灵活处理,相对map也更加强大)。: 从流中获取指定数量的元素,并返回一个新的流。

2024-03-30 18:02:04 357

原创 协程中Flow的一些特性二(背压)

让我来解释一下这段话,也就是说它会先发射的所有项(这里指的是消费者的delay,比如发射有5个,但是发射3个时已经到了消费者的收集时间,这时消费者将启动,前3个将作为一个项),再进行收集操作,并且保留最新的项,如下面代码为例,1是先发射的,它会最先到达下游,这时它是最新的项,所以会被收集,2是中间项,不是最新的(被3给覆盖掉),所以3也会被收集。时间:1000+3000+1000+3000+1000+3000 = 12000左右。时间:1000 + 9000 = 10000左右。这里使用delay来模拟。

2024-03-30 12:32:28 301

原创 协程中Flow的一些特性(冷流,流的连续型、构建器、上下文、指定协程中收集流、流的取消)

我们可以看到,其中的都是main主线程,而且在同一上下文,但是这并不符合我们实际开发需求,有时流的构建与收集并非在同一上下文里,此时我们需要使用flowOn。这很容易理解的,就是Flow收集的元素是按照顺序执行的,像水一样,先流进来就先出去,再一个关键就是这个连续性,对数据传输十分重要。就是说我们收集的流不在本线程调用了(collect),而是交给其他协程去调用,这在实际开发中也经常使用,这时要使用launchln。Flow是一种类似序列的冷流,flow构建器中的代码知道流被收集的时候才运行。

2024-03-29 16:58:08 515

原创 Kotlin协程—通过Flow异步返回多个值

只有当下游准备好接收数据时,流的执行才会重新启动,通过挂起函数的恢复机制从挂起的位置继续执行。协程调度器负责协程之间的切换、协程的调度和执行上下文的管理。通过协程调度器,Flow 可以在不同的线程或协程上执行异步任务,以提高并发性能。当 Flow 的订阅者取消订阅时,Flow 使用挂起函数的取消机制来终止流的执行。,显然,使用List或者Sequence序列并不能实现这样的效果(原因不赘述了,主要就是List不能实现逐个返回,Sequence不能实现异步操作),下面来解释一下通过Flow异步返回多个值。

2024-03-29 11:36:11 518 3

原创 协程异常聚合的理解

通过设置一个统一的异常处理器,可以捕获父协程及其所有子协程中抛出的异常,从而统一进行处理,简单来讲就是让异常变得更直观,更容易管理,而且其余异常绑定在第一个异常之上。创建子协程,那么当一个子协程出现异常被取消时,其他子协程不会受到影响,它们会继续执行。被取消的子协程会将异常传递给它的父协程,但不会取消其他子协程。创建子协程,那么当一个子协程出现异常被取消时,其他子协程也会被取消。这种情况下,被取消的子协程会抛出。一般来说,协程中子协程出现了异常,会传递到顶级父协程,父协程这时会取消其余的子协程,

2024-03-28 22:19:02 153

空空如也

空空如也

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

TA关注的人

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