kotlin
文章平均质量分 81
沙漠一只雕得儿得儿
沙漠一只雕,白月光与朱砂痣
展开
-
koin快速上手
Gradle Setup#添加 Koin Android 依赖项,如下所示:// Add Maven Central to your repositories if neededrepositories { mavenCentral() }dependencies { // Koin for Android compile "io.insert-koin:koin-android:$koin_version"}本例中我们一共需要编写5个文件,分为如下四个步原创 2021-09-02 14:25:34 · 689 阅读 · 0 评论 -
kotlin中CoroutineScope CoroutineContext的理解
简单来说,CoroutineScope是启动协程的作用域,所有协程都需要在作用域中启动,并且作用域内部创建子协程则会自动传播给子协程;而CoroutineContext则是在协程作用域中执行的线程切换。1、首先我们来看下Scope作用域的理解,示例代码:import kotlinx.coroutines.launchimport kotlinx.coroutines.runBlockingfun main() { runBlocking { val scope0原创 2021-01-28 17:35:51 · 3292 阅读 · 1 评论 -
kotlin SupervisorJob使用
1、更安全地处理async{}中的异常async构建器启动的协程中发生非CancellationException异常,会向外抛出,让其父协程及其他子协程停止。如下,其中一个子协程(即two)失败,并且它抛出了一个异常,第一个async以及等待中的父协程都会被取消, 所有在作用域中启动的协程都会被取消。import kotlinx.coroutines.*fun main() = runBlocking<Unit> { try { failedCo...原创 2021-01-28 16:12:07 · 4999 阅读 · 0 评论 -
kotlin flow使用
上例中flow2间隔15毫秒发射一个值,而flow需要500毫秒,那么第45毫秒时flow2已经发射到了第三个值是c,此时combine的第一次合并需要等到flow发射第一个值500毫秒时合并为1c,1秒时合并为2c,1500毫秒时为3c。运行结果即是,每隔1秒钟,打印出来一个数字,emit 方法用于发射值,collect方法是收集值,这里需要注意的是,我们可以看到 在main方法协程中,我们可以直接调用loadData的方法,这是因为flow构建块中的代码 就是一个suspend函数。原创 2021-01-28 13:51:49 · 3551 阅读 · 0 评论 -
kotlin小结
一、协程相关1-1、协程使用官网例子(组合挂起函数):https://www.kotlincn.net/docs/reference/coroutines/composing-suspending-functions.html1、顺序调用: suspend fun doSomethingUsefulOne(): Int { delay(1000L)// 假设我们在这里做了一些有用的事 return13 } suspend ...原创 2021-01-16 11:14:18 · 355 阅读 · 0 评论 -
kotlin的协程写法
默认顺序调用假设我们在不同的地方定义了两个进行某种调用远程服务或者进行计算的挂起函数。我们只假设它们都是有用的,但是实际上它们在这个示例中只是为了该目的而延迟了一秒钟: private suspend fun jobOne(): Int { delay(2500) return 1 } private suspend fun jobTwo(): Int { delay(1500) return 2 }原创 2021-01-13 19:42:09 · 444 阅读 · 0 评论 -
Kotlin协程中的异常
【译】Kotlin协程中的异常一个协程突然失败了!现在该怎么办?????当协程因出现异常失败时,它会将异常传播到它的父级,然后,父级将进行如下三步:1)取消其余的子协程,2)取消自身,3)将异常在传播给它的父级。异常将最终到达当前层次结构的根,在当前协程作用域启动的所有协程都将被取消。协程中的异常将在整个协程层次结构中传播虽然在某些情况下传播异常是有意义的,但是大多数情况下这样做是不可取的。设想一个处理用户交互的与UI相关的协程作用域,如果一个子协程抛出了异常,UI的作用域将转载 2021-01-10 11:38:47 · 897 阅读 · 0 评论 -
Kotlin协程的取消
【译】Kotlin协程的取消原文:Cancellation in coroutines作者:Florina Muntenescu译者:luckykelan取消正在进行的协程当启动多个协程时,逐个跟踪或取消它们可能会很麻烦,但是我们可以依靠取消父协程或协程作用域,因为这将取消它创建的所有协程。//假设我们已经为以下代码定义了一个作用域scopeval job1 = scope.launch {...} val job2 = scope.launch {...} scope.翻译 2021-01-10 11:37:11 · 1496 阅读 · 0 评论 -
Kotlin异步流
异步流挂起函数异步返回一个值, 而 Kotlin 的异步流返回多个值, 与 RxJava 中的流类似.序列 (Sequences)首先介绍一个数据类型, 序列(Sequences)表示一个延迟计算( lazily evaluated )的集合. 这里延迟即意味着异步, 或者惰性求值. 要取得它的值, 迭代它即可, 它有返回一个迭代器 (Iterator) 的方法, 所以可以在迭代器上进行各种方便的操作, 如filter,take,map等. 因为它是惰性求值的, 所以这个集合的元素可能是无限..原创 2021-01-10 11:25:57 · 1162 阅读 · 0 评论 -
kotlin协程教程
Kotlin 协程教程什么是协程协程就像非常轻量级的线程。线程是由系统调度的,线程切换或线程阻塞的开销都比较大。而协程依赖于线程,但是协程挂起时不需要阻塞线程,几乎是无代价的,协程是由开发者控制的。所以协程也像用户态的线程,非常轻量级,一个线程中可以创建任意个协程。协程的创建线程的创建方式主要有两种, 继承Thread, 或者实现Runnable接口, 而协程而是通过构建器(coroutine builder方法), 有点类似工厂方法, 调用一个静态工厂方法就可以返回一个协程.corout原创 2021-01-10 11:22:47 · 1453 阅读 · 0 评论 -
kotlin协程的生命周期与jetpack组件绑定
Android 如何使用协程安卓上, 协程可以帮忙解决两大问题:管理长时间运行的任务, 这些任务可能阻塞主线程, 导致 UI 卡顿. 在主线程上安全地调用网络或磁盘操作.安卓上使用协程的最好方式是使用官方的架构组件, 它们提供了对协程的支持. 目前ViewModel,Lifecycle,LiveData,Room组件提供了对协程一等的支持.ViewModelScope对ViewModel的支持主要是在ViewModel上提供了一个称为ViewModelScope的...原创 2021-01-10 11:18:00 · 1056 阅读 · 0 评论 -
依赖注入框架Koin(二)快速上手
一、集成Koin依赖包的添加//1、在project的build.gradle下,buildScript的dependencies添加 classpathbuildscript { repositories { jcenter() } dependencies { classpath "org.koin:koin-gradle-plugin:$koin_version" }}//2、应用koin插件apply plugin:原创 2021-01-03 17:13:58 · 769 阅读 · 0 评论 -
依赖注入框架Koin(一)知识预览
一、基础概念依赖注入(Dependency Injection)和控制反转(Inversion of Control)是同一个概念。具体含义是:当某个角色(可能是一个Java实例,调用者)需要另一个角色(另一个Java实例,被调用者)的协助时,在传统的程序设计过程中,通常由调用者来创建被调用者的实例。但在Spring里,创建被调用者的工作不再由调用者来完成,因此称为控制反转。创建被调用者实例的工作通常由Spring容器来完成,然后注入调用者,因此也称为依赖注入。DI依赖注入框架的优点:原创 2021-01-03 16:22:49 · 2146 阅读 · 0 评论 -
kotlin中将回调改写为协程
回调的写法在Java中再常见不过了。原创 2020-12-26 14:57:47 · 5352 阅读 · 0 评论 -
kotlin挂起函数
Kotlin组合挂起函数分为默认顺序调用、使用 async 并发、惰性启动的 async、async 风格的函数、使用 async 的结构化并发、取消始终通过协程的层次结构来进行传递:package groupimport kotlinx.coroutines.*import kotlin.system.measureTimeMillis/** * 使用协程进行并发总是显式的。 */suspend fun main() = runBlocking<Unit>{ p原创 2020-12-26 11:39:25 · 1410 阅读 · 0 评论 -
kotlin协程的挂起suspend
在协程上一篇中我们知道了下面知识点:协程究竟是什么 协程到底好在哪里 协程具体怎么用大部分情况下,我们都是用launch函数来创建协程,其实还有其他两个函数也可以用来创建协程:runBlocking asyncrunBlocking通常适用于单元测试的场景,而业务开发中不会用到这个函数,因为它是线程阻塞的。接下来我们主要来对比launch与async这两个函数。 相同点:它们都可以用来启动一个协程,返回的都是Coroutine,我们这里不需要纠结具体是返回哪个类。...原创 2020-12-26 11:32:56 · 4803 阅读 · 4 评论 -
kotlin跳出for循环
效果一:数组的forEach中直接retrun private fun test0() { val arr = intArrayOf(1,2,3,4,5,6,7) arr.forEach { if (it == 4) return Log.d(TAG, "value:$it") } Log.d(TAG, "this is End") }打印结果:可以看到程序程序在遍原创 2020-12-23 20:18:49 · 3372 阅读 · 1 评论 -
kotlin无法获取内部类引用,使用匿名对象
尝试在onCreate方法中获取视图的高度,但找不到任何方法来删除OnGlobalLayoutListener。在java中这么写是OK的:containerLayout.getViewTreeObserver.addOnGlobalLayoutListener(new OnGlobalLayoutListener() { @Override public void onGlobalLayout() { containerLayout.getViewTr原创 2020-12-23 11:34:16 · 979 阅读 · 0 评论 -
kotlin的智能类型转换
kotlin里面的智能类型转换有如下两个场景:场景一:自动推断类型并转换首先看下示例: var zhangsan: Zhangsan = Person("zhangsan") if (zhangsan is Person) { println(zhangsan as Person).name }用is操作符判断下zhangsan这个变量是否是Person类,如果是的话,打印出zhangsan的名字,打印时又将zhangs原创 2020-12-10 22:26:35 · 452 阅读 · 0 评论 -
kotlin ?: 运算符
val result: String? = "good boy"val length: Int = result?.length ?: 0当result为null时,length = 0当result不为null时,length为字符长度。这里使用的?: 运算符原创 2020-12-10 21:51:41 · 699 阅读 · 0 评论 -
kotlin之扩展函数
扩展函数扩展类的函数, 即Extension Function, 可以在已有类中添加新的方法, 比继承更加简洁和优雅.扩展View的dp转换函数.// 使用扩展函数fun View.dp_f(dp: Float): Float { // 引用View的context return TypedValue.applyDimension( TypedValue.COMPLEX_UNIT_DIP, dp, context.resources.displayMe原创 2020-12-10 21:43:47 · 626 阅读 · 0 评论 -
kotlin标准函数使用场景
一、apply:例如在初始化paint时,可以用apply,作用在自己身上://apply返回值是它本身,谁调用他他就返回谁this var paint = Paint().apply { isAntiAlias = true isDither = true style = Paint.Style.FILL_AND_STROKE strokeWidth = 6.0f }而这时要用let,则需要传入参数it,并且返回原创 2020-12-07 21:07:24 · 309 阅读 · 0 评论 -
kotlin属性委托
var coreResult: String by Saver("result") class Saver(var result: String) { operator fun getValue(thisRef: DetailCard, property: KProperty<*>): String { return result + "haha"//可以添加工具类,对传入进来的值进行操作 } oper...原创 2020-12-07 20:42:55 · 103 阅读 · 0 评论 -
kotlin过滤数组元素写法改进
原始写法,我们将一个集合中特定的字符串找到后放到另一个集合中,最后返回这个集合: fun getSpecialResult() : ArrayList<String>{ val arrays = ArrayList<String>() val resultArrays = ArrayList<String>() for (special in arrays) { if (special =原创 2020-12-07 20:20:22 · 1004 阅读 · 0 评论 -
kotlin通过解构获取返回值
我们通过简单模拟网络请求数据,返回值的获取方式: data class Response(var code: Int, var message: String) private fun execute(): Response { println("正在网络请求...") val code = 200 val message = "success" return Response(code, message) }原创 2020-12-07 20:06:11 · 1092 阅读 · 0 评论 -
kotlin判断是否为null写法优化
举例一:在java中我们经常会写这样的代码: if (time == null) { time = "上午"; }判断一个值是否为空,为空则设置一个默认值。但是在kotlin中可以有简便的写法:time ?: "上午"使用 ?: 的操作符,当time为空时,自动设置默认值即可,而无需判断举例二:if (time == null || time.length < 3) { LogUtils.e(TAG, "字符不合法")}可以原创 2020-12-07 19:33:00 · 6824 阅读 · 0 评论 -
kotlin静态内部类和java静态内部类的区别
首先我们看下RecyclerView的ViewHolder的写法,java和kotlin分别用静态内部类进行实现,代码是随意找的:java静态内部类: static class EndViewHolder extends BlocksView.ViewHolder { public EndViewHolder(View itemView) { super(itemView); itemView.setMinimumHeight原创 2020-12-07 19:08:16 · 7454 阅读 · 0 评论 -
kotlin改写private static final
java中的static final如下:public static final String TAG = "DetailPage/Presenter";在kotlin中我们利用伴生对象的方式进行改写:步骤一:static静态变量改写:使用伴生对象即可companion object { val TAG = "hehe"}这样就完成了java中的静态变量声明步骤二:final编译器常量改写:添加const关键字即可 companion object {原创 2020-12-10 23:14:19 · 1076 阅读 · 0 评论 -
Kotlin之匿名内部类
1.常规的方式实现匿名内部类,对象表达式:window.addMouseListener(object : MouseAdapter() { override fun mouseClicked(e: MouseEvent) { // ... } override fun mouseEntered(e: MouseEvent) { // ... }})具体例子如下:private fun setAnimation() { .原创 2020-12-07 18:37:37 · 3289 阅读 · 0 评论 -
kotlin转化java静态函数的三种方式
生成静态函数的三种方式:原始java静态函数:import android.content.res.Resources;import android.util.DisplayMetrics;import android.util.TypedValue;public class Utils { private static final DisplayMetrics displayMetrics = Resources.getSystem().getDisplayMetrics();原创 2020-12-07 17:38:57 · 679 阅读 · 0 评论 -
Kotlin 的扩展函数和属性
开始Kotlin 有个特别好用的功能叫扩展,你可以给已有的类去额外添加函数和属性,而且既不需要改源码也不需要写子类。这就是今天这个视频的主题。另外很多人虽然会用扩展,但只会最基本的使用,比如就只用来写个叫dp 的扩展属性来把 dp 值转成像素值:valFloat.dpget()=TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,this,Resources.getSystem().display...转载 2020-12-06 15:51:44 · 660 阅读 · 0 评论 -
kotlin项目报错Could not initialize class org.jetbrains.kotlin.gradle.internal.KotlinSourceSetProviderImp
报错一:Could not initialize class org.jetbrains.kotlin.gradle.internal.KotlinSourceSetProviderImplKt原因:kotlin与gradle版本不适配解决:在项目的build.gradle中调整kotlin版本以使其与的版本相匹配gradle,或者找个自己编译过了的项目对比下,gradle版本和kotlin版本报错二:Could not get unknown property 'apkVariantDa.原创 2020-12-06 10:52:06 · 6880 阅读 · 0 评论 -
Android startActivityForResult Kotlin写法
Android activity之间可以相互传递数据,从MainActivity传递数据到SecondActivity中,也可以由SecondActivity返回数据给回到MainActivity。向下一个Activity传递数据Intent在启动Activity过程中可以传递数据。Intent中提供了putExtra方法进行重载,举例来讲:将字符串从一个Activity中传递至第二个Activity中。 button1.setOnClickListener { .原创 2020-08-23 12:46:37 · 3066 阅读 · 0 评论