自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

移动端开发干货分享

公众号「AndroidPub」| 字节面试官,收简历:programonkey@gmail.com

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

原创 AsyncTask中的SerialExecutor

AsyncTask的线程模型AsyncTask专门用来进行UI线程与工作线程之间通信。每个AsyncTask只能执行一个任务,执行多个任务时需要创建多个AsyncTask实例。最早版本的AsyncTask,多个实例共享一个后台线程,所以多个task只能串行。从1.6开始,AsyncTask变成了共享线程池,彼时的线程池定义如下://核心线程数private static final...

2020-01-31 13:58:27 1168

原创 suspendCoroutine的异常捕获

suspendCoroutine中可以通过两种方式抛出异常,throw或者resumeWithException//throw suspend fun foo() : String = suspendCoroutine { //... throw RuntimeException()}//resumeWithExceptionsuspend fun foo() : ...

2020-01-30 20:45:30 3078 1

原创 拥抱Koin - 轻量级依赖注入框架

Koin是什么?Koin是一个轻量级的依赖注入框架,基于Kotlin的DSL进行DI的配置,全程无反射无代码生成。与Dagger的比较Dagger是Andorid官方推荐使用的DI框架,功能十分强大,但学习曲线陡峭,使用成本也相对较高。Koin在某些方面相对于Dagger具有以下优势:使用成本低,比如一个完整的MVVM架构的项目,使用dagger的话,需要对M/V/VM各层分别实现...

2020-01-30 16:25:09 3372

原创 使用Retrofit+LiveData时的Error/Loading处理

目前还有很多项目使用Retrofit2+LiveData进行API请求,LiveData在不像RxJava那样可以方便地进行Error处理,所以想基于LiveData封装一个工具类,对API请求中的Error/Loading等进行统一处理HttpManageropen class HttpManager<T>(context: Context, serviceClass: C...

2020-01-29 20:45:22 2551

原创 Kotlin Flow与ChannelFlow

通过Kotlin的Flow可以轻松实现生产者消费者模型。Flow默认是Cold的,生产者和消费者的通信是同步非阻塞的,也就是生产和消费会顺序交替进行suspend fun productor() = flow<Int> { for (i in 1..10) { delay(100) emit(i) ...

2020-01-29 12:57:50 4884

翻译 Kotlin Flow(一)基本使用

Kotlin协程中使用挂起函数(Suspend函数)可以异步地返回单个计算结果,但是如果有多个计算结果希望通过协程的方式异步返回,这时可以使用Flows(基于kotlin v. 1.3.61)。返回多个值的方式使用Collections一般我们可以使用集合类存储多个值,例如​foo()​返回一个list,包含3各成员,可以通过foreach对其遍历并打印结果fun foo(): ...

2020-01-29 01:51:08 18060

原创 Kotlin协程的launch与async

Kotlin中启动协程的方式常用的有两种:launch/join以及async/await。这两种方式有什么区别呢?launchlaunch用来启动一个子协程并立即返回,协程像线程一样异步执行。协程中的未捕获异常会导致进程的crash。launch返回一个Job对象,通过Job.join方法可以同步等待协程的完成,就像thread的join一样。fun main(args: Arra...

2020-01-28 23:05:42 2790

原创 基于Kotlin协程实现MVP/MVVM

Kotlin已经正式成为Android的官方开发语言,越来越多的Andorid框架/三方库开始用Kotlin实现。我也尝试通过Kotlin的协程来实现Android常见的MVP/MVVP架构,希望能将Kotlin更好地融入日常开发中。协程的同步和异步使用协程,可以方便地实现各种同步或者异步逻辑。通过suspend函数,我们可以在不阻塞线程的情况下,实现线程间的同步suspend ...

2020-01-28 21:22:10 1574

原创 Kotlin协程介绍(五)挂起函数

Kotlin协程介绍(二)实现原理中介绍过,挂起函数经过编译后以CPS的形式运行。反之,也可以将CPS转成挂起函数,使之可在协程中使用。这具体是通过​suspendCoroutine{}​或​suspendCancellableCoroutine{}​实现的public suspend inline fun <T> suspendCoroutine(crossinline bl...

2020-01-28 00:02:35 2102

原创 Kotlin协程介绍(四)创建协程 async/await

Kotlin协程介绍(四)创建协程 launch中介绍了可以使用launch创建并启动一个协程,除此之外还可以通过async创建并启动一个协程:public fun <T> CoroutineScope.async( context: CoroutineContext = EmptyCoroutineContext, start: CoroutineStart =...

2020-01-27 20:24:55 10124

原创 Kotlin协程介绍(三)创建协程 launch

通过Kotlin协程介绍(二)我们知道协程会将挂起函数(suspend函数)在编译期转换为CPS,suspend函数只能在协程或者另一个suspend中运行,那么如何创建一个协程呢?CoroutineScope.launch可以通过GlobalScope.launch创建并立即启动一个协程GlobalScope.launch { val start = System.curr...

2020-01-27 20:05:16 1333

原创 Kotlin协程介绍(二)实现原理

通过Kotlin协程介绍(一)我们了解到协程可以让顺序的代码实现CPS的效果,实际上协程的本质就是在编译期将顺序代码变为CPS。协程用suspend关键字声明一个挂起函数suspend fun delay(time: Int)挂起函数经过编译后,在jvm里会变成一个CPS://Continuation用来实现CPS的回调interface Continuation<T&gt...

2020-01-27 17:16:12 699

原创 Kotlin协程介绍(一)基本概念

协程(英文Coroutine)并非一个新概念,早在上世纪60年代Cobol编译器中被首次提出,其目的是将程序分离成多个任务,可以相互配合并且独立运行,co-routine的名字也正体现了互相配合之意。协程就像非常轻量级的线程。线程是由系统调度的,线程切换或线程阻塞的开销都比较大。而协程依赖于线程,但是协程挂起时不需要阻塞线程,几乎是无代价的,协程是由开发者控制的。协程的关键是分清挂起和...

2020-01-27 14:07:53 902

原创 Kotlin1.4的新特性抢先看

根据KotlinConf的消息,Kotlin1.4会在2020年发布。其中除了很多跨平台能力的补强之外,也有不少语法层面的改进,可能会对广大开发者带来更直接的影响Kotlin支持SAM转换SAM的意思是Singel Abstract Method,我们将只有单一方法的接口/抽象类成为SamType。Kotlin目前(最新1.3.6)仅能支持Java中的SAM转换//javapub...

2020-01-22 21:05:06 2248

原创 Rxjava操作符之share()

顾名思义,Rx的share操作符可以让多个Subscriber共享一个Observable发送的数据,举个例来说明:val observable = Observable.create<Int> { println("emmit start") thread(true) { repeat(5) { it1 -> it....

2020-01-21 20:37:36 1707

原创 Kotlin的SAM转换

Java中的SAMJava8之后,我们将只有单一方法的接口称为SAM(Single Abstract Method)接口,Java8通过Lambda可以大大简化对于SAM接口的调用。没有引入Lambda之前,我们是这样调用SamType的:interface JavaInterface { String doSomething(Item item);}String dele...

2020-01-20 22:05:13 3197

空空如也

空空如也

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

TA关注的人

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