为了账号安全,请及时绑定邮箱和手机立即绑定

基于 Kotlin + OkHttp 实现易用且功能强大的网络框架(一) 首发

okhttp-extension 是针对 okhttp 3 增强的网络框架。使用 Kotlin 特性编写,提供便捷的 DSL 方式创建网络请求,支持协程、响应式编程等等。 其 core 模块只依赖 OkHttp,不会引入第三方库。 okhttp-extension 可以整合 Retrofit、Feign 框架,还提供了很多常用的拦截器。 另外,okhttp-extension 也给开发者提供一种新的选择。 github地址:https://github.com/fengzhizi715/okhttp-extension Features: 支持 DSL 创建 HTTP...

842浏览
1推荐
0评论

Kotlin 、RxJava 以及传统的机器学习在手机质检上的应用 首发

一. 业务背景 隐私清除是手机质检的重要一环,我们回收的手机在经过自动化质检完成后,会对手机进行隐私清除。 在进行隐私清除之前,需要确保手机退出云服务的帐号。例如 iPhone 手机需要退出 iCloud ,华为、小米等手机都要退出对应的云服务。否则会造成隐私数据的泄漏的风险,也会让后续购买此手机的用户无法享受到云服务的功能。 因此,帐号检测是一项很重要的功能。本节以 Android 手机的帐号检测是否退出为例,主要是针对华为、小米等有比较明显的特征的手机,通过图像预处理、OC

679浏览
1推荐
0评论

在 Kotlin 中使用 WebFlux + R2DBC 开发 Web 项目 首发

一. R2DBC 介绍 在 R2DBC 官网(http://r2dbc.io/) 上,对 R2DBC 有一句话的介绍: > The Reactive Relational Database Connectivity (R2DBC) project brings reactive programming APIs to relational databases. R2DBC 的含义是 Reactive Relational Database Connectivity,它是一个使用响应式驱动程序集成关系数据库的孵化器。它是在响应式编程的基础上使用关系数据访问技术。 R2DBC 最初是一项实验和概念验证,旨在将 SQL...

1365浏览
1推荐
0评论

Kotlin Contract 首发

Kotlin 的智能推断是其语言的一大特色。 > 智能推断,能够根据类型检测自动转换类型。 但是,智能推断并没有想象中的强大,例如下面的代码就无法进行推断,导致编译失败: fun String?.isNotNull():Boolean { return this!=null && this.isNotEmpty() } fun printLength(s:String?=null) { if (!s.isNotNull()) { println(s.length) // Only safe (?.) or non-null asserted (!!.) calls are allowed...

902浏览
1推荐
0评论

Kotlin Collection VS Kotlin Sequence VS Java Stream 首发

一. 集合中的函数式 API 虽然 Kotlin Collection 中的函数式 API 类似于 Java 8 Stream 中的 API。但是 Kotlin 的集合跟 Java 的集合并不一致。 Kolin 的集合分为可变集合(mutable collection)和不可变集合(immutable collection)。不可变集合是 List、Set、Map,它们是只读类型,不能对集合进行修改。可变集合是 MutableList、MutableSet、MutableMap,它们是支持读写的类型,能够对集合进行修改的操作。 Kotlin 集合中的函数式 API 跟大部分支持 Lambda 语言的函

802浏览
1推荐
0评论

Mac 下搭建 Clion + OpenCV4.x 的开发环境 首发

搭建 Clion + OpenCV 首先,使用 homebrew 安装 OpenCV (目前最新的版本是 4.4)。 brew install opencv 然后在 Clion 中配置好本地安装的 gcc Mac 默认的 gcc 版本比较老是 4.2.1(可以通过 gcc --version 命令查看),因此也可以通过 homebrew 安装最新的 gcc。 下面在 Clion 中配置 gcc 的路径,选择的是使用 homebrew 安装的 gcc 编写一个 OpenCV 版本的 Hello World 上面的配置做完之后,我们来创建一个 HelloWorld 的项目 新创建的项目,默认使

3350浏览
1推荐
0评论

在 Kotlin 的 data class 中使用 MapStruct 首发

一. data class 的 copy() 为浅拷贝 浅拷贝是按位拷贝对象,它会创建一个新对象,这个对象有着原始对象属性值的一份精确拷贝。如果属性是基本类型,拷贝的就是基本类型的值;如果属性是内存地址(引用类型),拷贝的就是内存地址 ,因此如果其中一个对象改变了这个地址,就会影响到另一个对象。 深拷贝会拷贝所有的属性,并拷贝属性指向的动态分配的内存。当对象和它所引用的对象一起拷贝时即发生深拷贝。深拷贝相比于浅拷贝速度较慢并且花销较大。 data class 的 copy() 是复制函数

698浏览
1推荐
0评论

基于 Kotlin + Netty 实现一个简单的 TCP 自定义协议 首发

一. 开发背景 我们的项目需要开发一款智能硬件。它由 Web 后台发送指令到一款桌面端应用程序,再由桌面程序来控制不同的硬件设备实现业务上的操作。从 Web 后台到桌面端是通过一个 WebSocket 长链接来进行维护,而桌面程序到各个硬件设备也是一个 TCP 长链接来维护的。 本文讲述的,其实是从桌面程序到各个硬件之间的通讯。 二. 自定义通讯协议 首先,需要设计一个通用的 TCP 网络协议。 网络协议结构如下 +--------------+---------------+------------+---------------+----

1054浏览
2推荐
1评论

如何使用 Ktor 快速开发 Web 项目 首发

一. Ktor 介绍 Ktor 是一个高性能的、基于 Kotlin 的 Web 开发框架,支持 Kotlin Coroutines、DSL 等特性。 Ktor 是一个由 Kotlin 团队打造的 Web 框架,可用于创建异步、高性能和轻量级的 Web 服务器,并使用 Kotlin 惯用的 API 构建非阻塞的多平台 Web 客户端。 Ktor 的服务端仅限于 JVM,但是 Ktor 的客户端是一个 Multiplatform 的库。 如果使用 Kotlin Multiplatform 构建跨平台项目时,使用 Ktor 的客户端作为 Http 框架是一个不错的选择。 Ktor

1685浏览
1推荐
0评论

Kotlin Coroutines Flow 系列(五) 其他的操作符 首发

八. Flow 其他的操作符 8.1 Transform operators transform 在使用 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 {...

2520浏览
1推荐
0评论

OpenCV 在 Android 上的应用 首发

一. OpenCV 介绍 OpenCV是一个基于BSD许可(开源)发行的跨平台计算机视觉库,可以运行在Linux、Windows、Android和Mac OS操作系统上。它轻量级而且高效——由一系列 C 函数和少量 C++ 类构成,同时提供了Python、Ruby、MATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法。 在移动端上使用 OpenCV 可以完成一系列图像处理的工作。 二. OpenCV 在 Android 上的配置 我在项目中使用的 OpenCV 版本是 4.x。 在 Android Studio 中创建一个 Library,将官

579浏览
1推荐
0评论

Kotlin Coroutines Flow 系列(四) 线程操作 首发

七. Flow 线程操作 7.1 更为简化的线程切换 相对于 RxJava 多线程的学习曲线,Flow 对线程的切换友好地多。 在之前的 Kotlin Coroutines Flow 系列(一) Flow 基本使用 一文中曾经介绍过 Flow 的切换线程,以及 flowOn 操作符。 Flow 只需使用 flowOn 操作符,而不必像 RxJava 需要去深入理解 observeOn、subscribeOn 之间的区别。 7.2 flowOn VS RxJava 的 observeOn RxJava 的 observeOn 操作符,接收一个 Scheduler 参数,用来指定下游操作运行在特定

6361浏览
1推荐
0评论

基于 Kotlin+Netty 开发的 Android Web Server 首发

一. 开发背景 最近半年来,我一直在从事开发公司的自助手机回收机项目。该项目有点类似于 IoT 项目,通过 Android 系统来操作回收机中的各种传感器,以此来控制回收机中的各种硬件。这涉及到各种通信协议,例如串口的通信,还有 TCP、http 协议等。 在我们的回收机中,Android 上使用的 http 服务来自一个第三方的库,从监控上看最近该库报错有一点多。 我们回收机本身提供的 TCP、WebSocket 服务均由 Netty 开发,而 http 服务它运行在TCP之上,因此也可以使用 Netty 来提

1858浏览
1推荐
1评论

Kotlin Coroutines Flow 系列(三) 异常处理 首发

五. Flow 异常处理 Flow 可以使用传统的 try...catch 来捕获异常: fun main() = runBlocking { flow { emit(1) try { throw RuntimeException() } catch (e: Exception) { e.stackTrace } }.onCompletion { println("Done") } .collect { println(it) } } 另外,也可以使用 catch 操作符来捕获异常。 5.1 catch 操作符 上一篇文章Flow VS RxJava2曾讲述过 onCompletion 操作符。 但是...

2168浏览
1推荐
0评论

Kotlin Coroutines Flow 系列(二) Flow VS RxJava2 首发

三. Flow VS Sequences 每一个 Flow 其内部是按照顺序执行的,这一点跟 Sequences 很类似。 Flow 跟 Sequences 之间的区别是 Flow 不会阻塞主线程的运行,而 Sequences 会阻塞主线程的运行。 使用 flow: fun main() = runBlocking { launch { for (j in 1..5) { delay(100) println("I'm not blocked $j") } } flow { for (i in 1..5) { delay(100) emit(i) } }.collect { println(it)...

2351浏览
1推荐
0评论

Kotlin Coroutines Flow 系列(一) Flow 基本使用 首发

一. Kotlin Flow 介绍 Flow 库是在 Kotlin Coroutines 1.3.2 发布之后新增的库。 官方文档给予了一句话简单的介绍: Flow — cold asynchronous stream with flow builder and comprehensive operator set (filter, map, etc); Flow 从文档的介绍来看,它有点类似 RxJava 的 Observable。因为 Observable 也有 Cold 、Hot 之分。 二. Flow 基本使用 Flow 能够返回多个异步计算的值,例如下面的 flow builder : flow {...

5261浏览
4推荐
1评论

Android 开发中 Kotlin Coroutines 如何优雅地处理异常 首发

一. 尽量少用 GlobalScope GlobalScope 是 CoroutineScope 的实现类。我们以前使用过的 launch、async 函数都是 CoroutineScope 的扩展函数。 GlobalScope 没有绑定任何 Job 对象,它用于构建最顶层的协程。这些协程的生命周期会跟随着 Application。 在 GlobalScope 中创建的 Coroutines,是有可能会导致应用崩溃的。 例如: fun main() { GlobalScope.launch { throw RuntimeException("this is an exception")...

2899浏览
1推荐
1评论

Kotlin 范型之泛型约束、类型投影、星号投影 首发

一. 泛型约束(Generic constraints) Kotlin 跟 Java 一样,也拥有泛型约束。Java 使用 extends 关键字指明上界。 在 Kotlin 中使用:代替 extends 对泛型的的类型上界进行约束。 1.1 Upper bounds 下面的代码,在调用 sum() 函数时,传入的参数只能是 Number 及其子类,如果是其他类型,则会报错。 fun <T : Number> sum(vararg param: T) = param.sumByDouble { it.toDouble() } fun main() { val result1 = sum(1,10,0.6) val...

1674浏览
1推荐
0评论

Kotlin + Netty 在 Android 上实现 Socket 的服务端(续篇) 首发

一. 对原先 NettyServer 的改造 上一篇文章《Kotlin + Netty 在 Android 上实现 Socket 的服务端》 ,曾经介绍的 NettyServer 其实只存了最后一次使用的 Channel。 Channel 是 Netty 网络操作抽象类,包括网络的读、写、发起连接、链路关闭等,它是 Netty 网络通信的主体。 在现实的开发中,服务端可能需要的是保存多个 Channel,例如存放到 ConcurrentHashMap。 当客户端连上服务端时,通过 NettyServer 的 addChannel() 将 channel 添加到 Map 中。 当客户

2447浏览
1推荐
0评论

基于 Kotlin Coroutine 实现的 EventBus 首发

一. 背景 这段时间接手了一个比较紧急的项目,它是一个运行在某开发板上的 Android 项目。 该项目采用的架构比较老,例如 RxJava 还在使用 1.x 的版本。起初看到源码,我内心是拒绝的。(这大半年来,我在使用 C++ 开发桌面端、 Java/Kotlin 开发后端,不过没关系。)好在该项目最近开发的部分功能采用 Kotlin 编写,那我开发的功能也打算使用 Kotlin。 二. RxJava 版本的 EventBus 两年前,我在写《RxJava 2.x 实战》的时候,写过一个 RxJava 2 版本的 EventBus,并且

2758浏览
1推荐
0评论
首页上一页1234下一页尾页
意见反馈 帮助中心 APP下载
官方微信