Kotlin 知识点整理

  • Post author:
  • Post category:其他




Kotlin教程


https://www.cnblogs.com/Jetictors/p/8647888.html



带接收者的函数字面值


https://blog.csdn.net/OneDeveloper/article/details/82907555



Section1



有关java的final和Kotlin的val

  • val:常量
  • var:变量
  • Java的final

    不可修改

    编译的时候会把引用的值中基本类型进行copy
  • Kotlin中的val如果要像java中的final一样前面要加关键字const,并且要定义到类外面,就像python里类外面的
  • Kotlin中的函数可以同python和C++一样当成参数传递



lambda表达式


https://www.cnblogs.com/Jetictors/p/8647888.html

  • 函数入口参数->返回值



java 和kotlin比较

  • 字符串==在kotlin使用相当于java里的equals方法,在Java里是比较地址是否相等



空值处理

  • 函数的参数后面加上?就是代表可以传空值



when 表达式

  • 参数->结果: 类似java里的switch



定义区间

  • 1 until 100 :[1,100)
  • 1…16:[1,16]



交互式命令行(就是python的ipython)



list

  • withIndex
    在这里插入图片描述



map

在这里插入图片描述



函数式表达式

  • 当函数体只有一行代码,可以去掉括号直接用“=”为函数声明赋值
  • 在Kotlin中函数也是变量可以直接赋值给一个变量:
var i ={x:Int,y:Int ->x+y}

在这里插入图片描述





继承

  • 父类要打开加open,子类才能继承
  • 重写方法要加override



接口表示能力,抽象类表示本质



代理,委托

在这里插入图片描述

  • 下面这个的bug解决

    在这里插入图片描述
  • 把大头儿子声明成单例把类class关键字缓存object,调用就被创建了。调用的位置就不用()来new了,本身就是object而不是类了。
  • 在这里插入图片描述
  • 在这里插入图片描述



枚举

-定义

在这里插入图片描述

  • 使用

    在这里插入图片描述

    在这里插入图片描述



印章类(密封类)

sealed class Son {
    fun sayHello(){
        Log.e("111","大家好");
    }
    class  xiaoxiaolv:Son();
    class xiaoxiaoma:Son();



data class 数据类

  • 类似java里的bean,背后已经实现好了

    • equals()/hashCode()
    • toString()方法
    • componentN()方法
    • copy()方法



高阶函数

  • 行为参数化:就是把函数当参数使用,就是numpy,和pandas数据分析工具
  • 在这里插入图片描述



关于“?”


  • https://www.jianshu.com/p/51b2e5aa3dd8

  • ?在类名后表示:类可以为空

  • ?在对象名后表示:对象为空jvm不处理

  • A?:B表示:A对象为空用B代替

  • !!.A():表示不为空在走方法A()

    对比代码

  • 代码1

val roomList: ArrayList<Room>? = null
 // ?表示roomList为空,不执行,roomList?.size返回空
 //?:表示roomList?.size为空,用0代替
        if (roomList?.size ?: 0 > 0) {   
            Log.d("TAG", "-->> 房间数不是0")
        }
  • 代码2
fun showToast(json:String){
		//?表示后面的代码不执行
       mContext?.toast(json)
       //?表示不为空的时候才调后面的
        mContext?.let { it.toast(json) }

    }



有关泛型

public inline fun <T, R> Iterable<T>.map(transform: (T) -> R): List<R> {
    return mapTo(ArrayList<R>(collectionSizeOrDefault(10)), transform)
}
  • fun <T, R> :声明函数

  • Iterable.map:函数名

  • (transform: (T) -> R):参数(是一个函数引用)

  • List返回值类型

  • infix 中缀表达式



Section02



函数式编程

  • 闭包:

    • 复习python的闭包


      • 闭包

        :实例对象()对调用类中的__call__方法(本质是把调对象方法<对象()然后调用__call __>的过程优化,更加节省空间)

        第一调用外层的方法,返回里面一层的方法(函数名指向函数),并且为里面的变量付了值。

        类似于局部修改全局变量加全局,闭包修改外面加nolocal(python3才能用)

        —–特别注意:闭包返回的内函数变量指向的一个单独的空间包含了外函数设置的变量和内函数函数体本身;他与函数的区别就是除了拥有函数体本身,还拥有函数执行时特有的一些变量


      • 装饰器

        :为了满足开发 – 闭合原则,把本想加在函数内部的代码写到函数上面(用@引入)

        实现原理:采用闭包把等待装饰的函数变量传入闭包内的函数;把闭包返回的内函数变量赋值给待装饰函数同名的变量,覆盖原变量(最终调的是内函数);效果就是原函数和调用方式完全不变,达到增加功能的目的,其他不用修饰的位置也不用修改。

        等价于:待装饰函数变量=闭包外函数(待装饰函数变量)【就像把待装饰函数包装了一下,就是java的的装饰设计模式】,蟒解释器看到@ ***就执行上边等价的式子,跟调不调用待装饰函数没有关系

        还可以用对象()的方式取__call__的方式调用(@​​类名)
        

        如果要对装饰器加参数,流程是:先调参数传入参数,把返回的函数用来对待装饰的函数进行装饰

  • Kotlin中的闭包:类似



Gradle 脚本构建

  • 传统的工作:代码编写-编译-测试-手动依赖管理-打包-上传服务器
  • 构建工具ant,maven,Gradle就是自动完成(编译-测试-手动依赖管理-打包-上传服务器)
  • 支持kotlin管理脚本构建


project and task
  • project:编写的代码以任务task的方式插入到project类里面,通过插件的方式完成task工作
  • task

    在这里插入图片描述

-任务可以依赖管理

在这里插入图片描述

  • 任务task的生命周期

    • 扫描:扫描脚本文件,把闭包里的声明逻辑执行一遍


      在这里插入图片描述
    • 可以把声明式代码改成运行时代码

在这里插入图片描述

在这里插入图片描述

  • 总结 task的两个阶段:扫描,运行
  • gradle 可以把多个任务卸载一个闭包里,组成任务集



增量式更新


在这里插入图片描述

  • gradle 插件

    • 一般有application,java,war

      在这里插入图片描述



依赖管理

  • 依赖:compile ‘com.android.support:appcompat-v7:23.+’

    • compile ‘com.android.support:组织,开发的公司
    • appcompat-v7:包名
    • 23.+:版本号
  • 依赖分为:测试时依赖 和 编译时依赖
  • gradle的依赖管理,让之前混乱的依赖管理变的有序,
  • 并且当出现依赖冲突,gradle还会主动依赖最高版本的库
  • -可以采用闭包的方式把依赖包依赖的包取消

    在这里插入图片描述



增量更新



热修复(原理动态加载的方式把自己的新方法文件排到前面,来代替有问题的文件)

class MyApplication: Application() {
    override fun onCreate() {
        super.onCreate()

        val patchManager =  PatchManager(this);
        patchManager.init("1.0");//current version

        patchManager.loadPatch();

        val path = File(Environment.getExternalStorageDirectory(),"fixbug.apatch")
        patchManager.addPatch(path.absolutePath);//path of the patch file that was downloaded
    }
}
  • 生成更新包;apkpatch.bat -f new.apk -t old.apk -o out -k debug.keystore -p android -a androiddebugkey -e android
  • 添加更新包:adb push fixbug.apatch sdcard/



支付宝支付 客户端(服务端到pytnon 处理)

  • 支付的信息不要放在代码里,放在服务器,比如,商户私钥商户id(这样安全),服务器签好名,把签名信息发过来就行。
  • 第一次请求商户的服务器,拿到商品信息
  • 下面用到了支付宝的SDK
  • 第二次请求支付宝服务器,调取支付
  • 处理状态返回:成功,失败,取消(注意此时只是客户端知道了支付结果,公司的服务器还不知道这是:同步通知)
  • 支付宝会:异步通知 商家服务器:



Kotlin与H5混合开发

  • 去掉标题栏

    在这里插入图片描述


1.Kotlin调用与js通信的接口
  • h5调用Kotlin:对象就是传给h5用的,直接用对象名调就行
mWebView.addJavascriptInterface(object 对象,string 对象别名)
  • 记得提供的方法上要加注解 @JavascriptInterface
 @JavascriptInterface
class JavaScriptMethods{
    var mContext: Context?=null

    constructor(mContext: Context?) {
        this.mContext = mContext
    }

    @JavascriptInterface
    fun showToast(json:String){
        Toast.makeText(mContext,json,Toast.LENGTH_SHORT).show()
    }
}
  • h5页面调用:记住方法前要加上

    window
<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8" />
		<title>contlinjs</title>
	<script src="http://libs.baidu.com/jquery/1.9.0/jquery.js"></script>
	
	</head>
	
	<body>
		<h1>js</h1>
		<button id="btn1">js调用Kotlin方法</button><br />
		<br />
		<br />
		<button id="btn2">js调用Kotlin方法(callback)</button>
		
	</body>
	
	<script >
	 $($("#btn1").on("click",function(){
			var string ="jscontent\n"
			window.h5usecoklin.showToast(string)
		}))
	
		
	</script>	
</html>


2.Kotlin调用js的代码
  • 直接在Kotlin webview页面加载完成的回调中调用js的代码
inner private class MyWebViewClient : WebViewClient() {
        override fun onPageFinished(view: WebView?, url: String?) {
            super.onPageFinished(view, url)

            var json = JSONObject()
            json.put("name", "Kotlin")

            mWebView.loadUrl("javascript:showMessage("+json.toString()+")")

        }

    }


3.h5 callback 调用 Kotlin
  • 1.就是H5用Kotlin写好的方法请求网络:h5->Kotlin
  • 2.Kotlin把请求到的结果result,通过h5的方法返回给h5:Kotlin->h5

    • 但是Kotlin调用h5要用到webview所以要把webview传入到对象当中
    • webview的方法一定要在主线程,就是loadUrl()
    mWebView.loadUrl("javascript:showMessage("+json.toString()+")")
    
  • 注意:为了解耦h5同kotlin,在第一步h5请求kotlin的时候,把回调的方法名“callback”也传过去 “`


在线模板
  • 由于Kotlin代码没有变,js代码是在服务器的,所以,不用app重新编译,可以直接执行



设置dialog 显示在底部。

  • 在这里插入图片描述

  • 动画的实习可以:

    • 首先采用anim文件夹定义进入,退出的xml动画,
    • 然后在style文件中写自定义动画的样式(引入刚刚的动画),
    • 最后在动画运行的target view的style文件中引入动画样式;
  • 相对在线模板,还有本地模板

    • 就是把html放在本地,然后请求服务器的数据,填充到模板上,这个技术可以提高加载速度。
    • 方法就是创建assets目录
    • 把html项目放在项目里
    • 然后调用loadurl

      在这里插入图片描述



https安全编程

  • keystore:用jdk里的工具keytool生成

    • keytool -genkeypair -alias alipay -keyalg RSA -validity 3650 -keystore alipay.keystore
    • 通过keystore生成证书
    • 在这里插入图片描述
  • 注意对明文签名:用了md5(不可逆)和私钥加密,只能保证明文不能被串改。
  • 在这里插入图片描述
  • https大体步骤

    • ssl 上下文
    • 信任管理器
    • 添加数字证书
    • 主机名校验


加密总结



版权声明:本文为hukou6335490原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。