Kotlin笔记
文章平均质量分 78
任缥缈
天狼啸月的追逐
展开
-
Kotlin语言的单例实现方式
静态内部类实现方式class Singleton private constructor() { companion object { val instance = SingletonInstance.instance } private object SingletonInstance { val instance = Singleton () }}Kotlin语言的静态内部类单例的实现方式,没有什么好说的。几乎就是翻写Java的实原创 2020-11-10 19:40:08 · 353 阅读 · 0 评论 -
细说协程零六、协程泄露及async异常的处理
前言一、有效避免协程泄露的方式1、通过Job来处理2、通过MainScope()来处理3、viewModelScope对象4、lifecycleScope对象二、异常Exception以及async并发下的异常处理三、几个题外话:1、RxJava与kotlin协程比较2、AsyncTask内存泄露3、协程的delay()和Thread.sleep()谁的性能更好?4、什么时候需要切线程?Android项目开发中对协程的应用是比较灵活的,虽然依然是用****.luanch()来开启一段协程,通常指定Disp原创 2020-09-27 21:41:37 · 1586 阅读 · 2 评论 -
细说协程零五、Kotlin协程常用Api,只需本文就足够了
fun <V> requestData(mObservable: Observable<BaseData<V>>,callBack: HttpCallBack<V>): Disposable { return mObservable.subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(obj原创 2020-09-15 18:57:33 · 760 阅读 · 0 评论 -
细说协程零二、为什么要用协程
首先我们来看看目前Android开发中成熟的Retrofit + OkHttp + RxJava网络请求的格式:fun <V> requestData(mObservable: Observable<BaseData<V>>,callBack: HttpCallBack<V>): Disposable { return mObservable.subscribeOn(Schedulers.io()) .observeOn(原创 2020-09-15 18:15:29 · 366 阅读 · 0 评论 -
细说协程零四、Koltin协程的基本要素
Koltin协程的基本要素基本上都是上一节里面我们提到的那些元素:kotlin标准库、上下文、拦截器、挂起函数等等。这一节我们先来看看挂起函数。挂起函数val user = githubApi.getUserSuspend("bennyhuo")println(user)suspend fun getUserSuspend(): User { return githubApi.getUserSuspend("haoyuegongzi")} interface GitHubApi {原创 2020-09-15 11:05:16 · 312 阅读 · 0 评论 -
细说协程零三、协程的常见实现
一、协程的分类:1、按调用栈分:有栈协程:每隔协程会分配单独的类似线程的调用栈,比如Lua Coroutine;无栈协程:不会分配单独的调用栈,挂起点的状态通过闭包或者对象来保存,没办法嵌套函数,实现挂起,比如Python Generator。挂起和恢复没有函数的嵌套是无盏协程的非常典型的特征,否则即为有盏协程。有栈协程涉及到分配独立的内存等硬件资源,这是额外的资源开销,因此有栈协程的使用受到一定限制,没有无栈协程受欢迎。Kotlin、JavaScript、C#这些语言的协程都是属于无栈协程。2原创 2020-09-13 18:03:34 · 684 阅读 · 0 评论 -
细说协程零一、协程的概念
序引:什么是进程和线程直白地讲,进程就是应用程序的启动实例。比如我们运行一个游戏,打开一个软件,就是开启了一个进程。进程拥有代码和打开的文件资源、数据资源、独立的内存空间。线程又是什么呢?线程从属于进程,是程序的实际执行者。一个进程至少包含一个主线程,也可以有多个子线程。同时,线程拥有自己的栈空间。总结起来就是:对操作系统来说,进程是CPU进行资源分配和管理的最小单元,线程是CPU调度任务执行的最小单元。影子:什么是协程1、协程就是可以由程序自行控制挂起(暂停执行)、恢复(继续在原来暂停的地方原创 2020-09-13 10:07:02 · 484 阅读 · 1 评论 -
Kotlin学习笔记二十五、内部类、匿名内部类
内部类class NestedDemo { var mNested = "NestedDemo" fun funNested(){ println("funNested()") } class Outer { private val zero = 0 val one = 1 fun outerFun():Int{ return 1 } class I原创 2020-09-10 15:34:40 · 720 阅读 · 0 评论 -
Kotlin学习笔记二十四、Kotlin单例object关键字
kotlin里面的单例是通过关键字object来实现的:object Singleton { fun nowDateTime():String{ var sdf = SimpleDateFormat("yyyy-MM-dd HH:mm:ss SSS") return sdf.format(Date()) } val nowDate:String get() { var sdf = SimpleDateForm原创 2020-09-10 14:36:21 · 642 阅读 · 0 评论 -
Kotlin学习笔记二十三、代理delegate
代理的定义:我代表/代替你处理你的事情。我们先来定义一个接口:interface Api{ fun create() fun prepare() fun start() fun end()}再来看看他的实现类ApiImpl.kt :class ApiImpl:Api { override fun create() { println("create()") } override fun prepare() {原创 2020-09-10 11:33:30 · 163 阅读 · 0 评论 -
Kotlin学习笔记二十二、类属性延迟初始化
延迟初始化主要有一下几种方式:一、lateinit“lateinit”关键字的使用示例:lateinit var strData:Stringfun main(args: Array<String>) { strData = "任缥缈"}kotlin关键字“lateinit”使用注意事项:1、lateinit会让编译器忽略变量的初始化 ,同时不支持Int、Boolean、Char等基本数据类型;2、开发者必须在能够完全掌握变量的生命周期变化的场景下使用关键字“latei原创 2020-09-10 09:53:01 · 242 阅读 · 0 评论 -
Kotlin学习笔记二十一、集合的变换与序列以及聚合
集合的变换与序列这一节主要是记录集合list、map、array等的filter()、map()、flatMap()函数的使用。这些函数在日常开发中有着重要的地位。1、map的map()、 filter()方法:val mMap: MutableMap<String, String> = mutableMapOf("01" to "02", "13" to "35", "15" to "36", "03" to "45")将mMap的key和value拼接在一起形成新的字符串,返回一原创 2020-09-09 18:14:07 · 577 阅读 · 0 评论 -
Kotlin学习笔记二十、几个常用的高阶函数
示例:运行效果:上面5个函数,推荐优先使用let、also、use这三个。use主要用于IO操作、数据库操作等最后需要关闭的场景下,因为在“use”的内部已经帮我买处理了很多事情,比如try抛异常,比如关闭IO流:var list:List<String>File("KotlinDemo.iml").inputStream().reader(Charsets.UTF_8).buffered().use { list = it.readLines() println.原创 2020-09-08 17:56:12 · 281 阅读 · 0 评论 -
Kotlin学习笔记十九、内联函数
原因/定义:使用高阶函数会带来一些运行时的效率损失:每一个函数都是一个对象,并且会捕获一个闭包;即那些在函数体内会访问到的变量;内存分配(对于函数对象和类)和虚拟调用会引入运行时间开销。但是在许多情况下通过“内联化lambda表达式”可以消除这类的开销。普通函数怎么定义成内联函数?实现:就是在前面加“inline”关键字inline fun printMsg(){ println("Hello, Kotlin!!!")}就这样,“printMsg()”就是一个内联函数了。作用:减原创 2020-09-08 15:27:16 · 140 阅读 · 0 评论 -
Kotlin学习笔记十八、高阶函数
高阶函数函数定义:参数类型包含函数类型或者返回值类型为函数类型的函数为高阶函数本节没有太多的文字内容叙述,直接上代码:示例一、val mMap:MutableMap<String, String> = mutableMapOf("a" to "b")// 上面的“.forEach”、“.map”两个高阶函数以及类似这样的高阶行数:其实他的完整形态应该是这样的:“、map()”、“.forEach()”;// 当只有一个lambda表达式作为参数的时候我们可以直接省略小括号“()”m原创 2020-09-08 12:33:23 · 333 阅读 · 0 评论 -
Kotlin学习笔记十七、扩展函数与中缀表达式
kotlin里面:1、“= =”判断符号与“equals”方法是完全等价的,都是判断对象里面的内容是否相同,并不在意对象本身也就是地址是否相同;2、判断包含的符号“in”与“contains”是完全等价的;3、对于map集合的get[key]与map[key]、list集合的get[index]与list[index]、数组的的get[index]与list[index]他们的功用是完全等价的;4、表示比较大小的“>”、“<”、“>=”、“<=”判断符与方法“compareT原创 2020-09-07 14:54:29 · 239 阅读 · 0 评论 -
Kotlin学习笔记十六、《Kotlin学习笔记六、函数运用》的补充:扩展方法
我们知道,在Java里面,没有扩展方法这个概念,只有utils工具类,我们需要实现Java本身没有提供的功能API的时候,我们就只有自己写工具类来实现。但kotlin里面。我们是可以基于系统提供的API对系统功能进行扩展。当然这样的扩展只对本工程有效。扩展方法的实现形式:正常书写的方法名前加上“receiver”,也就是“要判断的对象的类名.”。比如下面的示例,我们要判断某个String字符串的是否为空:String.isEmpty(msg:String)。其中,“String.”就是我们“要判断的对原创 2020-09-07 11:12:01 · 325 阅读 · 0 评论 -
Kotlin学习笔记十五、关于“区间Range”的补充
这部分没什么太多的文字解释,因此直接上代码,通过代码在注释里面更直观的说明://創建一個前後都是閉合的閉區間,沒有指定步長step,所以默認步長為1var intRange = 1..10var charRange = 'a'..'z'var longRange = 1L..10Lvar floatRange = 1f..2fvar doubleRange = 1.0..2.0println("前後都是閉合的閉區間:" + "\n${intRange.joinToString(原创 2020-09-04 15:44:18 · 352 阅读 · 0 评论 -
Kotlin学习笔记十四、进度对话框ProgressDialog
这个比较简单,不多说,直接上代码,体验下,模拟下载环境下的下载进度对话框:var mExcutor: ScheduledThreadPoolExecutor? = nullvar progressDialog: ProgressDialog? = nullvar progressValue = 0var progressState = falsefun btnProgressDialog(){btnProgressDialog.setOnClickListener { if (progr原创 2020-05-18 14:19:53 · 1026 阅读 · 1 评论 -
Kotlin学习笔记十三、多线程的实现
Android开发中,只能是UI线程才可以更新UI界面,否则会抛出异常。除了UI线程意外的其他线程都被称为子线程。我们通常所说的多线程可以直接理解为多个子线程。在Java里面,要开启子线程,有三种方案:一是继承自Thread;二是实现Runable接口;三是线程池技术。但面对多任务处理的多线程需求是,还是推荐线程池来实现,这样可以避免线程反复的创建和收回,造成的资源浪费;同时由于消线程池内部实现了对线程的自我管理,这样能够大大的提高线程的使用效率。对于偶尔需要的子线程操作,推荐实现Runable原创 2020-05-18 14:15:19 · 1944 阅读 · 0 评论 -
Kotlin学习笔记十二、Kotlin复杂控件的使用
1、Spinner下拉框:spinner的spinnerMode属性,spinner显示为对话框(“dialog”)或者是下拉框(“dropdown”)形式;prompt属性表示spinner列表上方的提示;android:spinnerMode=["dialog"|"dropdown"]android:prompt="请选择城市"但无论是dialog模式还是dropdown模式,在Java里面实现起来都是一长串的代码,但是这要是放到Kotlin下的Anko库里面来看,也就三五行代码的事儿:v原创 2020-05-18 14:06:47 · 839 阅读 · 0 评论 -
Kotlin学习笔记十一、Kotlin中创建dialog
a、java环境下的Dialog转换为Kotlin环境下的Dialogvar dialog = AlertDialog.Builder(this)dialog.setTitle("还珠楼主") .setMessage("飘渺峰还珠楼") .setPositiveButton("神蛊温皇"){ dialogInterface: DialogInterface, i: Int -> logging("剑、蛊、毒三合一") } .setNegativeButton("秋水浮萍任缥缈"){ d原创 2020-05-18 13:41:57 · 1377 阅读 · 0 评论 -
Kotlin学习笔记十、Activity活动跳转
Java中,Activity的跳转,分三种场景:一是不带数据的跳转;二是带参数的跳转;三是带返回数据的跳转。但在Kotlin里面,分4种跳转场景:一是传统的Intent跳转;二是利用Anko库不带Intent的跳转,三是是否带参跳转,四是带返回数据的跳转。每种跳转的例子如下:a、传统的Intent跳转var parseData=ParseDataBean("touruliang","200","xiaoxioa","700","daixoa", "jiaohushuliang")va原创 2020-05-18 12:03:21 · 374 阅读 · 0 评论 -
Kotlin学习笔记九、Kotlin下常用布局的使用
1、线性布局LinearLayoutKotlin中线性布局这个View控件在xml布局文件中的使用方式跟Java中的使用就完全一样,没什么特别注意的地方。但是在kotlin代码中的使用相对于Java就有一些不同:Kotlin允许对属性orientation直接赋值,以取代Java中的setOrientation()方法,类似的还有gravity属性取代了setGravity()方法。Kotlin使用关键字as进行变量类型的强制转换,比如由View转换为Button:(view as butto原创 2020-05-18 11:32:49 · 1927 阅读 · 0 评论 -
Kotlin学习笔记八、Kotlin简单控件的使用
1、按钮Button:Button是Android最常用的控件之一。其用法我们这里主要是关注三个方面 ,一是点击事件,二是长按事件,三是设置文本、、点击背景效果等等。其中点击事件和长按事件用法上跟Java差不多,主要有匿名函数方式、内部类、接口实现三种。但是设置文本和获取文本有一些变化。a、匿名函数方式的点击事件和长按事件以及文本处理:Button的点击事件的实现及注意事项:btnButton.setOnClickListener { //因为it是一个View,因此我们要把它强制转换为Butt原创 2020-05-18 11:29:45 · 2789 阅读 · 0 评论 -
Kotlin学习笔记七、类与对象
1、类的构造,构造函数Java中的Activity类写法如下:public class MainActivity extends BaseActivity { ......}Kotlin中的Activity类写法如下:class MainActivity : BaseActivity() { ……}做个简单的对比发现,Kotlin对类的写法与Java之间有以下几点区别:Kotlin省略了关键字public,源于Kotlin默认就是开放的。Kotlin用冒号“:”代替了extend原创 2020-05-17 17:41:38 · 730 阅读 · 0 评论 -
Kotlin学习笔记六、函数运用
1、函数基本用法:A、与java的对比、区别:Java常规方法:@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main);}Kotlin常规方法:override fun onCreate(savedInstanceState: Bundle?) { super.onCre原创 2020-05-17 17:13:19 · 220 阅读 · 0 评论 -
Kotlin学习笔记五、控制语句
一、条件分支a、简单分支最简单的条件分支莫过于if…else…var mod = System.currentTimeMillis() % 3if (mod == 0L){ println("if...else...语句下时间节点刚好是可以被2整除的偶数:$mod")}else if (mod == 1L){ println("if...else...语句下嗯,这是个技术:$mod")}else{ println("if...else...语句下*****也是一个技术和体力兼备的活儿,你以原创 2020-05-17 15:00:58 · 429 阅读 · 0 评论 -
Kotlin学习笔记四、集合set-容器list-映射map相关
一、概述。Kotlin中的容器分三类,分别是集合Set、队列List、映射Map,跟Java的集合set、list、map一一对应。但是kotlin里面的容器又分为只读和可变两种类型。区别在于该容器是否可以进行增、删、改等变更操作。Kotlin语言里面,对于变量的修改操作是很谨慎的,每隔变量在声明的时候就必须指定能否修改。比如我们前面讲到过的,被val修饰的变量就不能够被修改,而被var修饰的则可以被修改。回到kotlin容器这边,kotlin默认容器为只读容器,如果要允许修改,就需要使用前缀Mutab原创 2020-05-17 14:39:57 · 698 阅读 · 0 评论 -
Kotlin学习笔记三、字符串String及操作
1、像Java那样,字符串String转换成其他数据类型:var int:String = "1"; var long = "20"; var float = "22.23"; var double = "32.15";var boolean = "true";var chars = "asdf"var integer:Int = int.toInt(); var longInteger = long.toLong(); var decimals = float.toFloat()va原创 2020-05-17 10:34:15 · 6036 阅读 · 0 评论 -
Kotlin学习笔记二、数组与数组基本操作
1、数组声明:数组声明格式:变量声明关键字 数组变量名:数组类型 = 数组类型of(元素1、元素2……)var intArray:IntArray = intArrayof(1, 2, 3, 4)kotlin数组与Java数组的区别:1、kotlin另外提供了新的整型数组类型:IntArray;2、分配一个常量数组,kotlin调用的是intArrayOf方法,并不使用new关键字。由此推广到其他数据类型的数组,创建数组变量的时候也不会用到new关键字。比如:var intArray:原创 2020-05-17 10:25:19 · 1397 阅读 · 0 评论 -
Kotlin学习笔记一、基本数据类型、赋值与转换
Kotlin基本数据类型:Int、Long、Double、Float、Boolean、Char、StringKotlin变量声明格式:变量声明关键字 变量名:变量类型 = ****;如:var index :Int = 10;var str:String = “yue”; val origin:Float = 6.5f;val index :Int = 10;val str:String = “yue”; var origin:Float = 6.5f;不同数据类型之间的转换:原创 2020-05-17 08:46:33 · 1207 阅读 · 0 评论