606 天前 / openio
WorkManager 是一个 Android Jetpack 扩展库,它可以让您轻松规划那些可延后、异步但又需要可靠运行的任务。对于绝大部分后台执行任务来说,使用 WorkManager 是目前 Android 平台上的最佳实践。 WorkManagerhttps://developer.android.google.cn/topic/libraries/architecture/workmanager/Android Jetpackhttps://developer.android.google.cn/jetpack/ 目前为止 WorkManager 系列已经讨论过: Android Jetpack WorkManager | Android 中文教学视频 在这篇文章中...
613 天前 / Android_开发者
写文章Kotlin 协程和 Android SQLite API 中的线程模型谷歌开发者已认证的官方帐号7 人赞同了该文章从 Room 2.1 版本之后,开发者们可以通过定义 suspend DAO 函数来使用 Kotlin 协程了。协程在处理异步操作时表现得异常优秀,它可以让您用顺序自然的代码处理诸如操作数据库一类的耗时操作,而不再需要专门在线程之间来回切换任务、处理结果或错误了。Room 支持协程后,可以在数据库操作中使用由并发作用域、生命周期、嵌套所带来的一些便利。 在我们为 Room 添加协程的支持期间,我们遇到并解决了在协程模型和 Android SQL API 中没想到的一些问题。
634 天前 / Tony沈哲
pexels-nguyn-xuan-trung-899737.jpg一. data class 的 copy() 为浅拷贝浅拷贝是按位拷贝对象,它会创建一个新对象,这个对象有着原始对象属性值的一份精确拷贝。如果属性是基本类型,拷贝的就是基本类型的值;如果属性是内存地址(引用类型),拷贝的就是内存地址 ,因此如果其中一个对象改变了这个地址,就会影响到另一个对象。 深拷贝会拷贝所有的属性,并拷贝属性指向的动态分配的内存。当对象和它所引用的对象一起拷贝时即发生深拷贝。深拷贝相比于浅拷贝速度较慢并且花销较大。
650 天前 / Tony沈哲
pexels-pixabay-157606.jpg 一。 开发背景我们的项目需要开发一款智能硬件。它由 Web 后台发送指令到一款桌面端应用程序,再由桌面程序来控制不同的硬件设备实现业务上的操作。从 Web 后台到桌面端是通过一个 WebSocket 长链接来进行维护,而桌面程序到各个硬件设备也是一个 TCP 长链接来维护的。 本文讲述的,其实是从桌面程序到各个硬件之间的通讯。 二。 自定义通讯协议首先,需要设计一个通用的 TCP 网络协议。 网络协议结构如下 +--------------+---------------+------------+---------------+-----------+----------+| 魔数 (4) | version(1)...
661 天前 / 街道-书记撸代码
Kotlin 协程让我们可以用同步代码来建立异步问题的模型。这是非常好的特性,但是目前大部分用例都专注于 I/O 任务或是并发操作。其实协程不仅在处理跨线程的问题有优势,还可以用来处理同一线程中的异步问题。 我认为有一个地方可以真正从中受益,那就是在 Android 视图系统中使用协程。 Kotlin 协程 https://developer.android.google.cn/kotlin/coroutines Android 视图 回调 Android 视图系统中尤其热衷于使用回调:目前在 Android Framework 中,view 和 widgets 类中的回调有 80+ 个...
661 天前 / 祝坤荣(时序)
原文地址:https://dzone.com/articles/migrating-from-lombok-to-kotlin 更短的代码不是目的,只有更可读的代码才是 译者:时序 作为一个 Java 开发者,最常见的抱怨是对 Java 语言冗长的抱怨。而其中出现最多的就是数据类。数据类,或者元祖,或者 record 记录类,未来在 Java 语言可能会消失,但在那天之前,任何时间创建一个 rest dto, jpa 实体,领域对象,或者任何类似的,Java 的冗余就出现了。在这篇文章里,我会介绍如何从 Lombok 迁移到 Kotlin,以及从迁移中能获得的收益。
675 天前 / 街道-书记撸代码
在 Java 语言中,static 关键字主要用于表明方法和属性是属于某个对象,而不是属于对象的实例。static 关键字也用于创建 Singleton ( 单例),单例模式是非常常见的设计模式,它可以帮您创建某个对象的唯一实例,并且其它对象也可以访问和分享该实例。 Kotlin 可以更加优雅地实现这种设计模式。您只需使用一个关键字: object,就可以实现单例。接下来的内容会告诉大家在 Java 和 Kotlin 中实现单例的区别,以及在 Kotlin 中如何在不使用 static 关键字的情况下实现单例,( 其实就是通过 object 关键字实现的)...
725 天前 / 技术小黑屋
巧用Kotlin反射实现按值取名,调试做到多快好省May 31st, 2020 痛点我们经常会定义一些常量,比如 1234567public interface ItemType {public static final int TYPE_TEXT = 0;public static final int TYPE_IMG = 1;public static final int TYPE_VIDEO = 2;public static final int TYPE_AUDIO = 3;public static final int TYPE_LINK = 4;}当我们打印查看是哪种类型的时候,如果单纯是打印int值,并不能足够解释业务信息,所以,为了更好的输出信息...
729 天前 / 静逸秋水
如果我们需要需要实现一个类似打印当前函数调用的文件名和函数的化,我们需要借助一些类库。 在 swift 中我们可以借助 #file 和 #line 来实现数据获取 /。 类似 public static func log(file: String = #file,line: Int = #line) {}而在 Android 我们需要借助 Thread 来实现 var str = ""try {val filename = Thread.currentThread().stackTrace[your_trace_index].fileNameval line = Thread.currentThread().stackTrace[your_trace_index].lineNumberstr = " $filename [l$line]"}catch (err: IOException) {// print(err)}return str 其中我们只需要确...
732 天前 / Tony沈哲
attractive-beautiful-fashion-female-245388.jpg 八。 Flow 其他的操作符 8.1 Transform operatorstransform 在使用 transform 操作符时,可以任意多次调用 emit ,这是 transform 跟 map 最大的区别: fun main() = runBlocking {(1..5).asFlow().transform {emit(it * 2)delay(100)emit(it * 4)}.collect { println(it) }}transform 也可以使用 emit 发射任意值: fun main() = runBlocking {(1..5).asFlow().transform {emit(it * 2)delay(100)emit("emit $it")}.collect { println(it) }}8.2 Size-limiting operatorstaketake 操作符只取前几个 emit...
744 天前 / 技术小黑屋
方法体没有多余层级,比较平单个方法出口更快更早发现问题(有点类似fail fast)file.createNewFile()执行时可以不需要再使用file.createNewFile() 这一点是因为使用了Contract。requirerequire(boolean) 用来检测方法的参数,当参数boolean为false时,抛出IllegalArgumentException示例代码123456789101112fun readFileContent(file: File): String {//判断file不能为nullrequireNotNull(file)//判断文件必须可读,并提供错误的信息require(file.canRead()) {"readFileContent file($file) is not readable"}//read file contentreturn "Your file conten...
745 天前 / Android开发
六、设计模式 1、函数式的对象——invoke 约定 Kotlin 的约定有很多种,而比如使用便捷的 get 操作,以及重载运算符等等,invoke 约定也仅仅是一种约定而已;我们可以把 lambda 表达式或者函数直接 保存在一个变量中,然后就像执行函数一样直接执行这个变量,这样的变量通常声明的时候都被我们赋值了已经直接定义好的 lambda,或者通过成员引用而获取到的函数;但是别忘了,在面向对象编程中,一个对象在通常情况下都有自己对应的类,那我们能不能定义一个类,然后通过构造方法来产生一个对象,然后直接执行它呢?这正是 invoke 约定发挥作用的地方。
750 天前 / Android开发
五、多态和扩展 1、重载算术运算符 算术运算符最能直观的反映 kotlin 的约定。在 kotlin 中,可以使用 += 等基本运算符对集合或者对象进行操作。 data class Point(val x:Int,val y:Int) { // 使用 operator 关键字声明 plus 函数 // 用于重载运算符的所有函数都需要用它标记,表示约定而不是同名函数 operator fun plus(other:Point): Point { // 坐标分别相加返回新的 Point return Point(x+other.x,y+other.y) }} val p1 = Point(10, 20) val p2 = Point(20, 30) // 等同 p1.plus(p2) println(p1 + p2) //Poin...
778 天前 / Tony沈哲
photo-of-woman-wearing-denim-jacket-2419423.jpg 七。 Flow 线程操作 7.1 更为简化的线程切换相对于 RxJava 多线程的学习曲线,Flow 对线程的切换友好地多。 在之前的 Kotlin Coroutines Flow 系列 ( 一) Flow 基本使用一文中曾经介绍过 Flow 的切换线程,以及 flowOn 操作符。 Flow 只需使用 flowOn 操作符,而不必像 RxJava 需要去深入理解 observeOn、subscribeOn 之间的区别。 7.2 flowOn VS RxJava 的 observeOnRxJava 的 observeOn 操作符,接收一个 Scheduler 参数,用来指定下游操作运行在特定的线程调度器 Scheduler 上。