![](https://img-blog.csdnimg.cn/20201014180756757.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Kotlin
文章平均质量分 80
且听真言
努力工作,玩命生活。
展开
-
Kotlin协程笔记:CoroutineScope管理协程
CoroutineScope 是实现协程结构化并发的关键。使用 CoroutineScope,可以批量管理同一个作用域下面所有的协程。原创 2022-12-21 19:03:54 · 4220 阅读 · 0 评论 -
kotlin协程笔记:Dispatchers
Kotlin 的 launch 会调用 startCoroutineCancellable(),接着又会调用 createCoroutineUnintercepted(),最终会调用编译器帮我们生成 SuspendLambda 实现类当中的 create() 方法。协程无法脱离线程运行,Kotlin 当中所有的协程,最终都是运行在线程之上的。协程创建出来以后,如何与线程产生关联的?原创 2022-12-19 20:24:25 · 664 阅读 · 0 评论 -
Kotlin协程 - launch原理 笔记
launch、async 可以创建、启动新的协程,那么协程到底是如何创建的?runBlocking{} 启动了第一个协程,launch{} 启动了第二个协程。原创 2022-11-19 18:03:11 · 1928 阅读 · 0 评论 -
基础知识笔记:协程基础元素
Kotlin 协程的基础元素:Continuation、SafeContinuation、CoroutineContext、CombinedContext、CancellationException、intrinsics。CombinedContext是 CoroutineContext 的一个实现类, SafeContinuation是 Continuation 的实现类。原创 2022-11-12 21:51:04 · 976 阅读 · 0 评论 -
Kotlin挂起函数基础
挂起函数,比普通的函数多了 suspend 关键字。通过suspend 关键字,Kotlin 编译器就会特殊对待这个函数,将其转换成一个带有 Callback 的函数,这里的 Callback 就是 Continuation 接口。例PS 转换过程中,函数的类型发生了变化:suspend ()->Any 变成了 (Continuation)-> Any?。原创 2022-11-06 16:24:10 · 1256 阅读 · 0 评论 -
Kotlin协程-try-catch基础
在 Kotlin 协程当中,我们通常把异常分为两大类,一类是取消异常(CancellationException),另一类是其他异常。在 Kotlin 协程当中,这两种异常的处理方式是不一样的。原创 2022-11-05 19:25:21 · 2452 阅读 · 0 评论 -
Kotlin协程-并发处理-基础
Kotlin协程是基于线程执行的。经过一层封装以后,Kotlin协程面对并发,处理方式与Java不同。在java的世界里,并发往往是多个线程一起工作,存在共享的变量。需要处理好同步问题。要避免把协程与线程的概念混淆。上述代码中没有任何并发任务,launch创建了一个协程,所有的计算都发生在协程中。所以不需要考虑同步问题。原创 2022-10-30 14:11:46 · 3450 阅读 · 0 评论 -
Kotlin协程-select基础
select——>用于选择更快的结果。基于场景理解比如客户端要查询一个商品的详情。两个服务:缓存服务,速度快但信息可能是旧的;网络服务,速度慢但信息一定是最新的。上述程序分为四步:第一步:查询缓存信息;第二步:缓存服务返回信息,更新 UI;第三步:查询网络服务;第四步:网络服务返回信息,更新 UI。用户可以第一时间看到商品的信息,虽然它暂时会展示旧的信息,但由于我们同时查询了网络服务,旧缓存信息也马上会被替代成新的信息。但是可能存在一些问题:如果程序卡在了缓存服务,获取网络服务就会无法执行。原创 2022-10-29 12:38:19 · 1186 阅读 · 0 评论 -
Kotlin-Flow基础学习
一、Flow简单介绍Flow——数据流Flow的特点是可以在发送和接收的过程中对数据进行变更。原创 2022-10-23 11:55:28 · 1254 阅读 · 0 评论 -
Kotlin协程-Channel基础
Channel 是一个管道。Channel分为接收方和发送方,发送方发送数据,接收方接收数据。通过Log可以发现@coroutine#3接收、@coroutine#2发送。Channel可以跨越不同的协程进行通信。在 @coroutine#1当中创建的 Channel,然后分别在 @coroutine#2、@coroutine#3 当中使用 Channel 来传递数据。可以发现:上面的例子中通过泛型设置Channel中传递的数据类型是Int,又在协程中调用send方法,把数据发送到管道里。原创 2022-10-13 20:09:52 · 1300 阅读 · 0 评论 -
Kotlin协程基础-CoroutineContext
CoroutineContext是协程的上下文,它的使用场景很多。1.CoroutineScope的launch扩展函数的第一个参数就是CoroutineContext,默认值是EmptyCoroutineContext。2.withContext() 函数的参数中也有CoroutineContext。原创 2022-09-30 16:11:05 · 1427 阅读 · 0 评论 -
kotlin协程生命周期-基础
协程生命周期原创 2022-09-24 16:33:42 · 1164 阅读 · 0 评论 -
Kotlin挂起函数整理-基础
suspend关键字修饰的方法 就是 挂起函数。挂起函数的本质是Callback。可以发现上面的Continuation 是一个带有泛型参数的Callback,这里的转换称为CPS转换,将原本的同步挂起函数转换成CallBack异步代码。Kotlin编译器检测到suspend关键字修饰的函数,会将挂起函数转换成带有CallBack的函数。注意:runBlocking 的第二个参数 也是 传入一个 suspend修饰的函数 即挂起函数。注意:挂起函数,只能在协程中被调用,或者被其他挂起函数调用。原创 2022-09-06 20:53:41 · 672 阅读 · 0 评论 -
如何启动Kotlin协程
启动协程的基本方式。原创 2022-09-04 16:50:23 · 1328 阅读 · 0 评论 -
软键盘问题整理
最近开发中遇到了一些软键盘相关的问题,所以整理下与大家分享:一、软键盘的开启与关闭开启:1、获取InputMethodManager实例。2、调用showSoftInput()方法。fun showSoftInput(view: View?) { view?.let { val inputMethodManager = it.context?.getSystemService(Context.INPUT_METHOD_SERVICE.原创 2022-02-12 19:08:43 · 1551 阅读 · 0 评论 -
Rxjava 整理(未完)
一、定义RxJava是一个基于事件流、实现异步操作的库。二、gradle配置 implementation 'io.reactivex.rxjava3:rxjava:3.0.0'三、 Rxjava相关操作符介绍1.create() 创建操作符。创建被观察者对象。private fun doRxJavaCommonTest() { Observable.create(ObservableOnSubscribe<String> { ..原创 2021-07-11 19:08:01 · 357 阅读 · 1 评论 -
Kotlin集合操作整理
一、转换类1.1转换为数组集合类提供了toIntArray()、toDoubleArray()、toFloatArray()、toBetArray()等函数,将集合转换成相应的数组。例:toIntArray()方法public fun Collection<Int>.toIntArray(): IntArray { val result = IntArray(size) var index = 0 for (element in this)原创 2020-11-26 22:22:59 · 1082 阅读 · 0 评论 -
Kotlin协程学习之启动模式
好文参考:https://juejin.cn/post/6893809019425816584https://juejin.cn/entry/68449038542454128711.概念Essentially, coroutines are light-weight threads.协程是轻量级的线程。线程是由系统调度的,线程切换或线程阻塞的开销都比较大。而协程依赖于线程,但是协程挂起时不需要阻塞线程,几乎是无代价的,协程是由开发者控制的。所以协程也像用户态的线程,非常轻量级,一.原创 2020-11-22 15:39:37 · 354 阅读 · 0 评论 -
Kotlin注解整理
我们首先定义给 Int定义一个扩展函数。fun Int.compare(num: Int): Int { return if (this > num) { this } else num}在Kotlin代码中我们可以直接调用:println(2.compare(1))但是在 Java代码中我们的调用方式变为:public static void main(String[] args) { int num = TestAno原创 2020-10-17 18:13:41 · 657 阅读 · 1 评论 -
Kotlin中@JvmOverloads注解的作用
在Kotlin中@JvmOverloads注解的作用:指示Kotlin编译器为此函数生成替换默认参数值的重载。如果一个方法有N个参数,其中M个具有默认值,则会生成M个重载。第一个重载采用N-1个参数(最后一个采用默认值),第二个采用N-2个参数,依此类推。因为在 Kotlin 中可以调用具有默认参数值的方法或者构造函数,但是在 Java 代码调用相应 Kotlin 代码却不行,及Java 代码不能调用Kotlin 中定义的具有默认参数的重载函数或构造函数。@JvmOverloads 就是用来解.原创 2020-10-05 14:56:01 · 1955 阅读 · 0 评论 -
Kotlin 扩展函数的局限与注意点总结
一、扩展方式对扩展函数的影响Kotlin是一种静态类型语言,我们创建的每个对象不仅具有运行时,还具有编译时类型,开发人员必须明确指定(在Kotlin中可以判断)。在使用扩展函数时,要清楚地了解静态调用和动态调用之间的区别。1.静态与动态调度public class Base { public void payfoo() { System.out.printl...原创 2020-03-22 23:25:19 · 1006 阅读 · 0 评论 -
总结几个Kotlin扩展的应用
一、用扩展函数优化Snackbar例如一般Snackbar的使用:Snackbar.make( coordinatorLayout!!, "这是一个snackbar", Snackbar.LENGTH_SHORT).show()Anso框架中Snackbar的扩展函数。inline fun View.snackbar(message: Int, ...原创 2020-03-21 17:31:10 · 1141 阅读 · 0 评论 -
Kotlin标准库中常用扩展函数总结
Kotlin标准库中有一些非常实用的扩展函数。run/** * Calls the specified function [block] with `this` value as its receiver and returns its result. */@kotlin.internal.InlineOnlypublic inline fun <T, R> T.run...原创 2020-03-15 11:56:07 · 454 阅读 · 0 评论 -
Kotlin多态和扩展总结
一.多态的不同方式对Java而言,多态是面向对象设计的一个重要特征。当我们使用一个子类继承一个父类的时候,这就是子类型多态。另一种是参数多态(泛型)。1.1子类型多态class PayCustomerHelper(context: Context) : SQLiteOpenHelper(context, "kotlin.db", null, 1) { override fun...原创 2020-03-14 15:58:44 · 1052 阅读 · 0 评论 -
Kotlin总结之内联函数
在Kotlin 中使用 Lambda表达式会带来一些额外的开销。但可以通过内联函数优化。一. 优化Lambda开销在Kotlin中每次声明一个Lambda表达式,就会在字节码中产生一个匿名类。该匿名类包含了一个invoke方法,作为Lambda的调用方法,每次调用的时候,还会创建一个新的对象。可想而知,Lambda虽然简洁,但是会增加额外的开销。Kotlin 采用内联函数来优化Lambda...原创 2020-03-07 12:06:57 · 5004 阅读 · 0 评论 -
Kotlin集合库的设计总结(部分)
一、集合的继承关系Iterable为Kotlin集合库的顶层接口。每一个集合分为两种,一种为带Mutable前缀的,另一种则是不带的。比如常见的列表分为MutableList和List,List实现了Collection接口,MutableList实现了MutableCollection和 List接口,MutableList表示可变的 List,而List表示只读List。其实Kotli...原创 2020-03-01 09:43:26 · 398 阅读 · 0 评论 -
Lambda和集合总结( 部分)
在集合操作中使用Lambda会使代码变得非常简洁和优雅,但是这种简洁和优雅也是有代价的,就是在Kotlin中使用Lambda表达式会带来一些额外的开销。为了解决这个问题,所以要了解下内联函数。1.调用Java函数式接口textClick.setOnClickListener(object : View.OnClickListener{ override fun onClick(v...原创 2020-02-24 23:54:58 · 911 阅读 · 0 评论 -
Kotlin总结之协变与逆变
1.为什么List<String>不能赋值给List<Object>?通过反证法看这个问题,如果List<String>能赋值给List<Object>会出现什么情况?public static void main(String[] args) { List<String> strList = new ArrayList...原创 2020-02-19 23:53:28 · 1778 阅读 · 0 评论 -
Kotlin面向对象总结之泛型(部分,涉及泛型类、泛型参数使用)
范型的优势:1.类型检查,能在编译时就能帮你检查出错误。2.更加语义化,比如声明一个List<String>,可以知道存储的是String对象,而不是其他对象。3.自动类型转换,获取数据时不需要进行类型强制转换。4.能写出更加通用化的代码。在Kotlin中使用泛型1.声明一个泛型类和泛型函数//泛型类可以继承另一个类class PaySmartLi...原创 2020-02-16 17:29:00 · 1610 阅读 · 1 评论 -
Kotlin面向对象总结(Any、Any?、Nothing、自动装箱与拆箱、数组类型)
Java并不能在真正意义上被称作一门“纯面向对象”语言,因为它的基本类型与函数并不能看作对象。在Kotlin类型系统中,并不区分基本数据类型与包装类型。Kotlin类型结构图(选取String、Int、自定义类型)Any;非空类型的根类型与Object作为Java类层级结构的顶层类似,Any类型是 Kotlin 中所有非空类型的超类。对于Kotlin 来说,...原创 2020-02-15 12:12:15 · 3820 阅读 · 0 评论 -
Kotlin类型系统总结(可空类型、非空断言、类型检查、智能转换、强制转换)
Java如何解决NPE问题?1.函数内对于无效值,更倾向于抛异常处理。特别地,在Java里应该使用专门的自定义Checked Exception。对于经常出现无效值的、有性能需求或在代码中经常使用的函数并不合适。对于自身可取空值的类型,比如说集合类型,通常返回零长度的数组或者集合,虽然会多出内存开销。2.采用@NotNull/@Nullable标注。对于一段复杂的代码,检查参数是否为空是一...原创 2020-02-14 16:58:38 · 875 阅读 · 0 评论 -
Kotlin代数数据类型总结(部分)
什么是代数数据类型(ADT)?比如通过常见的枚举来创建一个简单的代数数据类型。常见的代数类型是“和”类型与“积”类型。代数:就是能代表数字的符号。像一元方程:x+5=6y*3=21上面的x,y 就是代数,x代表数字1,y代表数字7。对于操作符:“+”和“*”,通过代数和操作符能做什么?x*1=za+2=c像上面的x 与1相乘得到新的代数。a与2相加得到...原创 2020-02-12 21:21:58 · 713 阅读 · 0 评论 -
kotlin面向对象总结-伴生对象
在Java中,static修饰的内容属于类,而不属于具体对象。在Kotlin中,引入了全新的关键字object,代替使用static的场景。Kotlin中伴生对象——companion object两个关键字。伴生对象,“伴生”是相较于一个类而言的,,意为伴随某个类的对象,它属于这个类所有,因此伴生对象跟Java中static修饰效果性质一样,全局只有一个单例。它需要声明在类的内部,在类被...原创 2020-02-09 15:32:32 · 1440 阅读 · 0 评论 -
kotlin面向对象总结-数据类
kotlin通过data class创建数据类。package com.example.kotlindemo.classsdemodata class PayDataBird(var weight: Double, var age: Int, var color: String)Kotlin转javapublic final class PayDataBird { pri...原创 2020-02-07 17:25:25 · 448 阅读 · 0 评论 -
Kotlin面向对象总结-解决多继承的问题
kotlin和Java一样只支持类的单继承。1.接口实现多继承kotlin中的接口与Java很相似,但它除了可以定义带默认实现的方法之外,还可以声明抽象的属性。用kotlin接口实现多继承package com.example.kotlindemo.classsdemointerface PayKFlyer { fun fly() fun kind(...原创 2020-02-06 16:25:39 · 1509 阅读 · 0 评论 -
Kotlin面向对象总结-访问控制原则
在Java中,如果希望一个类被别人继承或者修改,那么可以使用 final来修饰它。可以用 public、private、protected等修饰符来描述一个类、方法或属性的可见性。Kotlin在默认修饰符的设计上采用了与Java不同的思路。Kotlin相比Java,对一个类、方法或属性有着不一样的访问控制原则。限制修饰符指定一个类、方法或属性的修改或者重写权限时,需要用到限制修饰...原创 2020-02-05 21:14:42 · 849 阅读 · 2 评论 -
Kotlin面向对象总结-延迟初始化与主从构造函数
延迟初始化: by lazy 和 lateinitby lazyclass PayFlyAnimal(val weight: Double, val age: Int, val color: String) { val sex: String by lazy { if (color == "yellow") "male" else "female" }...原创 2020-02-04 09:48:25 · 1812 阅读 · 0 评论 -
Kotlin面向对象总结-构造函数
kotlin中通过class结构体来声明一个类。//Kotlin中的类class PayBird { val weight: Double = 100.0 val color: String = "blue" val age: Int = 1 fun fly() { }}一些特点:1.不可变属性成员。Kotlin用 va...原创 2020-02-04 11:45:14 · 388 阅读 · 0 评论 -
Kotlin基础总结(部分二) 字符串
kotlin中字符串的定义和操作fun main() { val str = "hello world!" println("str.length:" + str.length) println("str.substring(0,5):" + str.substring(0, 5)) println(str + " hello!!") printl...原创 2020-02-01 16:30:12 · 534 阅读 · 0 评论 -
Kotlin基础语法总结(部分)
1.增强的类型推导。(类型推导是Kotlin在Java基础上增强的语言特性之一)fun main(args: Array<String>) { val str = "Kotlin" val numberInt = 123456 val numberLong = 123456L val numberFloat = 12.45f val ...原创 2020-01-31 14:43:41 · 2372 阅读 · 0 评论