6 xlh1191860939

尚未进行身份认证

一个android小菜鸟

等级
TA的排名 4w+

Kotlin学习系列之:inline、noinline和crossinline

inline:我们在之前已经对其做了专题描述,具体可参阅Kotlin学习系列之:inline noinline. 当我们的内联函数中有多个lambda参数时,如果我们想要其中某一个lambda参数不进行内联,则可以使用noinline关键字。 fun main() { myMethod(former = { println("former") }...

2020-03-31 18:12:26

Kotlin学习系列之:协程上下文与分发器

我们在协程的第一篇就已经提过,协程的运行是依赖于线程的。那么协程与线程之间的关系到底是怎样的呢?协程上下文(Coroutine Context):多种元素的集合,包括Job、分发器等。协程总是会在某个上下文中执行的,这个上下文是由CoroutineContext类型的一个实例来决定的。协程分发器(Dispatcher):决定协程运行在哪个线程或者线程池上,对应的类就是Coroutine...

2020-03-22 00:28:45

Kotlin学习系列之:使用async和await实现协程高效并发

引例:private suspend fun intValue1(): Int { delay(1000) return 1}private suspend fun intValue2(): Int { delay(2000) return 2}fun main() = runBlocking { val elapsedTime = me...

2020-03-20 00:33:36

Kotlin学习系列之:协程的取消和超时

​ 通过前面的三篇文章,我们已经讨论了协程的创建。有的时候,我们在启动了一个协程之后,并不需要该协程执行完毕,这个时候我们可以取消该协程的执行。比如在Android开发中,我们打开了一个页面,我们在进入页面的时候启动了一个协程来发起了网络请求,但是用户立马就关闭了页面,这个时候我们就可以取消这个协程的执行,因为我们已经不需要它的执行结果了。我们先来回顾一下CoroutineSc...

2020-03-19 16:30:58

Kotlin学习系列之:协程的创建(三)

经过前面两篇的学习,我们现在可以来总结一下,我们可以有哪些方式来启动一个协程:GlobalScope.launch{} runBlocking{} 接下来我们介绍另外的两种方式,我们先直接来看代码:fun main() = runBlocking {// GlobalScope.launch {// delay(1000)// print...

2020-03-16 20:35:27

红黑树(Java)学习系列一:二叉排序树

​ 红黑树(Red-Black Tree)是一种非常重要的数据结构,在开发中我们时常能够见到它的身影,如JDK中的TreeMap、TreeSet以及JDK8中的HashMap,在它们的底层实现中都使用到了红黑树。红黑树的学习成本还是挺高的,为了掌握这一数据结构,我们决定从二叉排序树开始讲起,然后逐步衍生到AVL树、2-3树,最后再过渡到红黑树。本篇就是此系列的第一篇:二叉排序树。二叉排...

2020-03-15 13:25:41

Flutter和Dart系列十二:动画(Animation)

一个App中如果能有优秀的动画效果,能让App看起来显得更加高大上。此篇我们就来介绍一下Flutter中Animation体系。 我们先来一个简单的例子,来实现透明度渐变动画: class FadeInDemo extends StatefulWidget { @override State createState() { return _FadeInDemoState...

2020-02-06 13:48:47

Flutter和Dart系列十一:Function(二)

我们在系列四中已经介绍了Dart中有关Function的基本概念,今天我们来围绕“函数作为一等公民,作为对象”这一概念来展开讨论和总结。 将一个函数赋值给一个变量. add(int a, int b) => a + b;void main() { var sum = add; print(sum(1, 2)); // 打印3} 对于add函数,我们将其赋值给变量...

2020-01-10 11:17:17

使用OkHttp实现WebSocket通信之:断线重连

之前的两篇关于如何使用OkHttp来实现WebSocket通信,然后有很多小伙伴私信问我如何实现断线重连,今天我就把我项目中实现的重连机制代码贴出来:(我的实现思想就是基于斐波那契数列来进行尝试重连)1. 抽象的接口:interface IRetryStrategy { fun retry(url: String) fun reset()}2. 重连策略实现类...

2019-11-23 17:58:46

Kotlin学习系列之:委托(Delegate)

1. 引入:委托作为一种传统的设计模式,在Java中要想实现这种设计模式,就需要自己进行类的结构设计来实现。而在Kotlin中,提供语言层面上的支持,我们可以通过by关键字很轻松就能实现。2. 类委托(class delegate) 自己动手实现委托: interface ServerApi { fun login(username: String, password: S...

2019-08-15 16:28:10

理解设计模式之:状态模式

1. 定义:当一个对象的内在状态改变时,允许改变其行为,这个对象看起来像是改变了其类。2. 对状态模式的理解:状态模式中的行为是由状态决定的,不同的状态下有不同的行为。状态模式的意图是让一个对象在其内部状态改变的时候,其行为也随之改变。3. 状态模式中的角色:Context:环境角色,定义客户感兴趣的接口,维护一个State子类的实例,这个实例定义了对象的当前状态 State:抽象状...

2019-08-13 19:22:34

Kotlin学习系列之:运算符重载(operator overloading)

1.引入:运算符重载,最初接触到这个概念是在C++里,Java中是没有的,取而代之的是通过特定接口来实现,比如进行排序比较大小时,我们可以实现Comparable接口。而Kotlin中,又重新支持该特性,因为这样会显得更加直观。2.如何实现运算符重载: 方式一:在类内定义,以成员方法(member)的形式 比如,我们定义一个Point类: data class Point(va...

2019-08-08 21:09:10

Flutter和Dart系列十:Json序列化

在前一篇我们已经可以在Flutter中同服务器进行交互了,但是那时我们是通过String来接收的,即可以拿到json格式的数据,那么怎么来解析成实体对象呢?1. 手动解析:借助于dart的内置库(dart:convert)dart:convert中有俩个top-level function:jsonDecode()、jsonEncode(),分别用来解析json和生成json。给定一段...

2019-08-06 10:26:51

Kotlin学习系列之:协程的创建(二)

在系列一中,我们已经对协程有了初步的了解,我们在此篇继续。前面我们是通过GlobalScope.launch{}这个协程建造器来创建协程的,它的特点就是: Launches a new coroutine without blocking the current thread. 即不会阻塞当前的线程的运行。我们再来接触一个不一样的协程建造器: runBlocking{} ...

2019-08-01 16:57:13

Kotlin学习系列之:协程的创建(一)

1.协程:Coroutine2.如何去理解协程: 可以视为轻量级的线程 我们可以回顾一下什么是线程。从操作系统原理的角度来讲,进程是资源分配的基本单位,而线程是调度的基本单位,也就是说线程实际上是系统级别的,它运行与否是由操作系统决定的。从Java语言层面上讲,我们可以通过new Thread().start这种形式去启动一个线程,我们可以查看Thread类的源代码: publi...

2019-07-20 23:32:33

Flutter和Dart系列九:简单的网络请求

与其说是Flutter的网络请求,倒不如说是Dart的网络请求。实际上这块是对系列八第5点的一个复习,我们直接看代码: 在.yaml文件中添加http依赖,然后执行Packages get dependencies: flutter: sdk: flutter http: ^0.12.0+2 新建一个api.dart文件 import 'package...

2019-07-15 20:45:19

grpc in Android

最近公司客户端同服务器的交互方式都换成了grpc,什么是grpc呢?我们在以后再去了解,此篇的目的就是带大家了解在android中如何去使用grpc.grpc-java的github地址:https://github.com/grpc/grpc-java。大家可以去浏览一下里面的文档说明,不用动手。 对于Android程序员,我们需要重点关注的是:https://grpc.io/docs...

2019-05-07 16:03:17

Flutter和Dart系列之八:路由

截至目前为止,我们的Widget都是在一个页面上实现的。对于一个App而言,不可能只有一个页面。那么在Flutter怎样实现页面间的跳转呢? 启动一个新的页面:Navigator.push(),类似Android中的startActivity class MyApp extends StatelessWidget { @override Widget build(BuildC...

2019-03-15 17:58:30

final关键字在Android和Java中使用总结

final作用于类上:表示该类不可被继承 某些类在设计的时候,可能出于安全的考虑,不希望被继承,例如String类。final类中的属性和方法可以是final或者非final,但是由于不能被继承,也就意味着final类中的方法都是final的,当然你也可以显式去指定。在《Effective Java》一书中,有句名言“design and document for inheritance...

2019-03-14 13:35:06

Flutter和Dart系列七:Column和Row

对于线性的布局排列,Android中使用的是LinearLayout,至于是横向还是纵向,则是通过orientation属性来指定的,orientation=vertical表示纵向线性,orientation=horizontal表示横向线性。在Flutter中,将这两种线性布局分别用Column和Row来表示。 Column:orientation=vertical void ma...

2019-03-12 12:30:46

查看更多

勋章 我的勋章
  • 专栏达人
    专栏达人
    授予成功创建个人博客专栏的用户。专栏中添加五篇以上博文即可点亮!撰写博客专栏浓缩技术精华,专栏达人就是你!
  • 持之以恒
    持之以恒
    授予每个自然月内发布4篇或4篇以上原创或翻译IT博文的用户。不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累!
  • 勤写标兵Lv2
    勤写标兵Lv2
    授予每个自然周发布4篇到6篇原创IT博文的用户。本勋章将于次周周三上午根据用户上周的博文发布情况由系统自动颁发。