From 33e2505074417bad384f97ccff56bb03d5b501bd Mon Sep 17 00:00:00 2001 From: CharonChui Date: Thu, 11 Apr 2024 10:57:00 +0800 Subject: [PATCH] update kotlin part --- .../12.Navigation\347\256\200\344\273\213.md" | 28 +++- .../4.ViewModel\347\256\200\344\273\213.md" | 5 + ....8.Kotlin_\345\215\217\347\250\213.md.swp" | Bin 65536 -> 0 bytes ...&\347\261\273&\346\216\245\345\217\243.md" | 139 ++++++++++++++++++ ...2\344\270\276&\345\247\224\346\211\230.md" | 63 +++++++- ...5\345\260\204&\346\211\251\345\261\225.md" | 8 + ...10\346\201\257\346\234\272\345\210\266.md" | 5 + README.md | 2 +- 8 files changed, 241 insertions(+), 9 deletions(-) delete mode 100644 "KotlinCourse/.8.Kotlin_\345\215\217\347\250\213.md.swp" diff --git "a/Jetpack/architecture/12.Navigation\347\256\200\344\273\213.md" "b/Jetpack/architecture/12.Navigation\347\256\200\344\273\213.md" index dac4d75d..38c42a53 100644 --- "a/Jetpack/architecture/12.Navigation\347\256\200\344\273\213.md" +++ "b/Jetpack/architecture/12.Navigation\347\256\200\344\273\213.md" @@ -4,6 +4,11 @@ 为此,Jetpack提供了一个名为Navigation的组件,旨在方便我们管理页面和App bar。 + +Navigation 是一个框架,用于在 Android 应用中的“目的地”之间导航,该框架提供一致的 API,无论目的地是作为 fragment、activity 还是其他组件实现。 + + + 它具有以下优势: - 可视化的页面导航图,类似于Apple Xcode中的StoryBoard,便于我们理清页面间的关系。 @@ -15,6 +20,16 @@ Navigation 组件旨在用于具有一个主 Activity 和多个 Fragment 目的地的应用。主 Activity 与导航图相关联,且包含一个负责根据需要交换目的地的 `NavHostFragment`。在具有多个 Activity 目的地的应用中,每个 Activity 均拥有其自己的导航图。 + +在使用过程中,我们感受到如下的优点。 + +- 页面跳转性能更好,在单 Activity 的架构下,都是 fragment 的切换,每次 fragment 被压栈之后,View 被销毁,相比之前 Activity 跳转,更加轻量,需要的内存更少。 +- 通过 Viewmodel 进行数据共享更便捷,不需要页面之间来回传数据。 +- 统一的 Navigation API 来更精细的控制跳转逻辑。 + + + + ## 依赖 如果想要使用Navigation,需要现在build.gradle文件中添加以下依赖: @@ -51,17 +66,20 @@ dependencies { 导航组件由以下三个关键部分组成: -1. Navigation Graph +1. Navigation Graph : 图表 + 一种数据结果,用于定义应用中的所有导航目的地以及它们如何连接在一起。 在一个集中位置包含所有导航相关信息的 XML 资源。这包括应用内所有单个内容区域(称为*目标*)以及用户可以通过应用获取的可能路径。 -2. NavHost + +2. NavHost : 主机 显示导航图中目标的空白容器。导航组件包含一个默认NavHost实现 (NavHostFragment),可显示Fragment目标。 -3. NavController +3. NavController : 控制器 - 在NavHost中管理应用导航的对象。当用户在整个应用中移动时,NavController会安排NavHost中目标内容的交换。 + 在NavHost中管理应用导航的对象。当用户在整个应用中移动时,NavController会安排NavHost中目标内容的交换。 + 该控制器提供了一些方法,可用于在目的地之间导航、处理深层链接、管理返回堆栈等。 在应用中导航时,您告诉NavController,您想沿导航图中的特定路径导航至特定目标,或直接导航至特定目标。NavController便会在NavHost中显示相应目标。 @@ -476,7 +494,9 @@ override fun onCreate(savedInstanceState: Bundle?) { ``` +### 参考 +https://mp.weixin.qq.com/s?src=11×tamp=1712714064&ver=5191&signature=JTMgHGLtMGW*NoSWSrLNVuGzs-KEEDznO-ja7*X*KumZMFAuIRl7WbPYT1gG7AX810nUx6Ftb6nm6Ao92M*GzojPfqBUo1wOFc0gMs1mseTLkUWZ9Q*BIW69MM7ULPDV&new=1 - [上一篇:11.Hilt简介](https://github.com/CharonChui/AndroidNote/blob/master/Jetpack/architecture/11.Hilt%E7%AE%80%E4%BB%8B.md) diff --git "a/Jetpack/architecture/4.ViewModel\347\256\200\344\273\213.md" "b/Jetpack/architecture/4.ViewModel\347\256\200\344\273\213.md" index 7c8a3198..5ec5a6bf 100644 --- "a/Jetpack/architecture/4.ViewModel\347\256\200\344\273\213.md" +++ "b/Jetpack/architecture/4.ViewModel\347\256\200\344\273\213.md" @@ -11,6 +11,11 @@ `ViewModel`是专门用于存放应用程序页面所需的数据。ViewModel将页面所需的数据从页面中剥离出来,页面只需要处理用户交互和展示数据。 + +ViewModel类是一种业务逻辑或屏幕级状态容器。 +它用于将状态公开给界面,以及封装相关的业务逻辑。 +它的主要优点是,它可以缓存状态,并可在配置更改后持久保留相应状态。这意味着在activity之间导航时或进行配置更改后(例如旋转屏幕时),界面将无需重新提取数据。 + Viewmodel解决两个问题: 1. 数据的变更与view隔离,也就是解耦 diff --git "a/KotlinCourse/.8.Kotlin_\345\215\217\347\250\213.md.swp" "b/KotlinCourse/.8.Kotlin_\345\215\217\347\250\213.md.swp" deleted file mode 100644 index 996ab1630d5f280941394ce9a4cbef5c514922e6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 65536 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 diff --git "a/KotlinCourse/1.Kotlin_\347\256\200\344\273\213&\345\217\230\351\207\217&\347\261\273&\346\216\245\345\217\243.md" "b/KotlinCourse/1.Kotlin_\347\256\200\344\273\213&\345\217\230\351\207\217&\347\261\273&\346\216\245\345\217\243.md" index 5e1b19fa..72e4986b 100644 --- "a/KotlinCourse/1.Kotlin_\347\256\200\344\273\213&\345\217\230\351\207\217&\347\261\273&\346\216\245\345\217\243.md" +++ "b/KotlinCourse/1.Kotlin_\347\256\200\344\273\213&\345\217\230\351\207\217&\347\261\273&\346\216\245\345\217\243.md" @@ -324,10 +324,42 @@ var myProperty: String } ``` +自定义set和get的重点在field,field指代当前参数,类似于java的this关键字。 + 这意味着无论何时当你使用点操作符来获取或设置属性值时,实际上你总是调用了属性的getter或是setter。那么,为什么编译器要这么做呢? 为属性添加getter和setter意味着有访问该属性的标准方法。getter处理获取值的所有请求,而setter处理所有属性值设置的请求。 因此,如果你想要改变处理这些请求的方式,你可以在不破坏任何人代码的前提下进行。通过将其包装在getter和setter中来输出对属性的直接访问称为数据隐藏。 + +在某些情况下,无参的函数与只读属性可互换通用。虽然语义相似,但在以下情况中,更多的是选择使用属性而不是方法。 + +- 不会抛出任何异常。 +- 具有O(1)的复杂度。 +- 容易计算(或者运行一次之后缓存结果)。 +- 每次调用返回同样的结果。 + + + +## 后端属性(Blocking Property) + +它实际上是一个隐含的对属性值的初始化声明。能有效避免空指针问题的产生。 + +```kotlin +var size: Int = 2; +private var _table: Map? = null + +val table: Map + get() { + if (_table == null) { + _table = HashMap() + } + return _table ?: throw AssertionError("Set to null by another thread") + } +``` + +在Java中,访问private成员变量需要通过getter和setter来实现,此处通过table来获取_table变量,优化了Java中函数调用带来的开销。 + + ## 延迟初始化 在类内声明的属性必须初始化,如果设置非`null`的属性,应该将此属性在构造器内进行初始化。 @@ -475,6 +507,47 @@ fun getName() : String { ``` +## @操作符 + +在Kotlin中,@操作符主要有两个作用: + +- 限定this的对象类型 +```kotlin +class User { + inner class State { + fun getUser(): User { + return this@User // 返回User + } + + fun getState(): State { + return this@State // 返回State + } + + } +} +``` +- 作为标签使用 +当把@操作符作为标签使用时,可以跳出双层for循环和forEach函数。 +例如: +```kotlin +val listA = listOf(1, 2, 3, 4, 5, 6) +val listB = listOf(2, 3, 4, 5, 6, 7 ) + +loop@ for(itemA in listA) { + var i: Int = 0 + for (itemB in listB) { + i++ + if (item > 2) { + break @loop // 当itemB > 2时,跳出循环 + } + println("itemB: $itemB") + } +} +``` + + + + ## 类的定义:使用`class`关键字 @@ -630,6 +703,25 @@ class Person private constructor(name: String) { } ``` + + +```kotlin +open class Base(p: Int) +class Example(p: Int) : Base(p) +``` + +如果该类有一个主构造函数,那么其基类型可以用主构造函数的参数进行初始化。 +如果该类没有主构造函数,那么每个次构造函数必须使用super关键字初始化其类型,或者委托给另一个构造函数初始化。如: +```kotlin +class Example : View { + constructor(ctx: Context) : super(ctx) + + constructor(ctx: Context, attrs: AttributeSet) : super(ctx, attrs) +} +``` + + + #### 构造方法默认参数 ```kotlin @@ -841,6 +933,48 @@ var age = f1.component2() 对于有些不需要toString()、equals()、hashCode()方法的类如果使用数据类就会导致多生成这些代码,所以在使用数据类的时候不要去为了简单而乱用, 也要去想想是否需要这些方法?是否需要设计成数据类。 + +#### 获取类中成员函数的对象 + +```kotlin +fun main(args: Array) { + var user = User::special + // 调用invoke函数执行 + user.invoke(User("Jack", 30)) + + // 利用反射机制获取指定方法的内容 + var method = User::class.java.getMethod("special") + method.invoke(User("Tom", 20)) +} + +class User(val name: String, val age: Int) { + fun special() { + println("name:${name") age:${age}"); + } +} +``` + +在上面的实例中,User类还有一个special函数,使用User::special可以获取成员函数的对象,然后使用invoke函数调用special函数,以获取该函数的内容。 + + +### 构造函数引用 + +构造函数的引用和属性、方法类似,构造函数可以作用于任何函数类型的对象,该函数的对象与构造函数的参数相同,可以使用::操作符加类名的方式来引用构造函数。 + +```kotlin +class Foo + +fun function(factory: () -> Foo) { + val x: Foo = factory() +} + +// 使用::Foo方式调用类Foo的无参数构造函数 +fun main() { + function(::Foo) +} +``` + + ## 继承 在`Kotlin`中所有类都有一个共同的超类`Any`,这对于没有超类型声明的类是默认超类: @@ -1214,6 +1348,11 @@ val mList2 = vars(0, *myArray, 6, 7) ``` +在Kotlin中,方法调用也被定义为二元操作运算符,而这些方法往往可以转化为invoke函数。 +例如 a(i)方法的对应转换方法为 a.invoke(i) + + + ## 命名风格 如果拿不准的时候,默认使用`Java`的编码规范,比如: diff --git "a/KotlinCourse/5.Kotlin_\345\206\205\351\203\250\347\261\273&\345\257\206\345\260\201\347\261\273&\346\236\232\344\270\276&\345\247\224\346\211\230.md" "b/KotlinCourse/5.Kotlin_\345\206\205\351\203\250\347\261\273&\345\257\206\345\260\201\347\261\273&\346\236\232\344\270\276&\345\247\224\346\211\230.md" index 9c91998e..1d1ab9da 100644 --- "a/KotlinCourse/5.Kotlin_\345\206\205\351\203\250\347\261\273&\345\257\206\345\260\201\347\261\273&\346\236\232\344\270\276&\345\247\224\346\211\230.md" +++ "b/KotlinCourse/5.Kotlin_\345\206\205\351\203\250\347\261\273&\345\257\206\345\260\201\347\261\273&\346\236\232\344\270\276&\345\247\224\346\211\230.md" @@ -132,6 +132,8 @@ class Outter{ val outter = Outter() outter.Inner().execute() +var v = this@Outer.testVal // 引用外部类的成员 + // 输出 Inner -> execute : can read testVal=test ``` @@ -142,6 +144,11 @@ val outter = Outter() outter.Inner().execute() ``` +引用外部类中对象的方式为: var 变量名 = this@外部类名 + +在类成员中,this指代该类的当前对象。而在扩展函数或者带接受者的函数中,this表示在点左侧传递的接收者参数。 + + #### 内部类vs嵌套类 在Java中,我们通过在内部类的语法上增加一个static关键词,把它变成一个嵌套类。然而,Kotlin则是相反的思路,默认是一个嵌套类, @@ -154,6 +161,8 @@ outter.Inner().execute() #### 匿名内部类 +没有名字的内部类被称为匿名内部类,使用匿名内部类必须继承一个父类或实现一个接口,匿名内部类可以简化代码编写。 + ```kotlin // 通过对象表达式来创建匿名内部类的对象,可以避免重写抽象类的子类和接口的实现类,这和Java中匿名内部类的是接口和抽象类的延伸一致。 text.setOnClickListener(object : View.OnClickListener{ @@ -179,6 +188,16 @@ mViewPager.addOnPageChangeListener(object : ViewPager.OnPageChangeListener { }) ``` +如果对象实例是一个函数接口,还可以使用Lambda表达式来实现。 +```kotlin + +val listener = ActionListener { + println("clicked") +} +``` + + + ### 枚举 与Java中的enum语法大体类似,无非多了一个class关键字,表示它是一个枚举类。 @@ -612,12 +631,16 @@ public static Instance getInstance() { 具体的业务逻辑执行者 + + ##### 类委托 在委托模式中,有两个对象参与处理同一个请求,接受请求的对象将请求委托给另一个对象来处理。 `kotlin`中的委托可以算是对委托模式的官方支持。 `Kotlin`直接支持委托模式,更加优雅,简洁。`Kotlin`通过关键字`by`实现委托。 +委托模式已被证明是类继承模式的一种很好的替代方案。 + 我们经常会打游戏进行升级,但是有时候因为我们的水平不行,没法升到很高的级别,这就出现了很多的游戏代练,他们帮我们代打,这就是一个委托模式: 1. 定义约束类,定义具体需要委托的业务,这里的业务: @@ -660,6 +683,10 @@ public static Instance getInstance() { ##### 属性委托 +在软件的开发中,属性的getter和setter方法的代码有很多相同或相似的地方,虽然为每个类编写相同的代码是可行的,但这样会造成大量的代码冗余,而委托属性正是为解决这一问题而提出的。 + +属性委托是指一个类的某个属性值不是在类中直接定义,而是将其委托给一个代理类,从而实现对该类属性的统一管理。 + 在Kotlin中,有一些常见的属性类型,虽然我们可以在每次需要的时候手动实现他们,但是很麻烦,为了解决这些问题,Kotlin标准提供了委托属性。 语法是`val/var <属性名>: <类型> by <表达式>`。在`by`后面的表达式是该委托,因为属性对应的`get()`和`set()`会被委托给它的`getValue()` @@ -667,12 +694,15 @@ public static Instance getInstance() { ```kotlin class Example { + // 语法中,关键词by之后的表达式就是委托的类,而且属性的get()以及set()方法将被委托给这个对象的getValue()和setValue()方法。 + // 属性委托不必实现相关接口,但必须提供getValue()方法,如果是var类型的属性,还需要提供setValue()方法。 var property : String by DelegateProperty() } class DelegateProperty { var temp = "old" // getValue和setValue方法的参数是固定的 + // getValue和setValue方法必须用关键字operator标记 operator fun getValue(ref: Any?, p: KProperty<*>): String { return "DelegateProperty --> ${p.name} --> $temp" } @@ -798,8 +828,10 @@ fun main() { +### 标准委托 -`Kotlin`通过属性委托的方式,为我们实现了一些常用的功能,包括: + +`Kotlin`通过属性委托的方式在Kotlin标准库中内置了很多工厂方法来实现属性委托,包括: - 延迟属性`lazy properties` - 可观察属性`observable properties` @@ -810,6 +842,9 @@ fun main() { 延迟属性我们应该不陌生,也就是通常说的懒汉,在定义的时候不进行初始化,把初始化的工作延迟到第一次调用的时候。`kotlin`中实现延迟属性很简单, 来看一下。 +lazy()是一个接收Lambda表达式作为参数并返回一个Lazy实例的函数,返回的实例可以作为实现延迟属性的委托。 +也就是说,延迟属性第一次调用get()时,将会执行传递给lazy()函数的Lambda表达式并记录执行结果,后续所有对get()的调用只会返回记录的结果。 + ```kotlin val lazyValue: String by lazy { Log.d(JTAG, "Just run when first being used") @@ -892,7 +927,24 @@ fun later(block: () -> T) = Later(block) ##### 可观察属性 -如果你要观察一个属性的变化过程,那么可以将属性委托给`Delegates.observable`, `observable`函数原型如下: + +所谓可观察属性(observable),就是当属性发生变化时能自动拦截其变化,实现观察属性值变化的委托函数是Delegates.observable()。 + +该函数接受两个参数: + +- 初始值 +- 属性值变化时间的响应器(handler) + +每当给属性值赋值时都会调用该响应器,该响应器主要有3个参数: + +- 被赋值的属性 +- 赋值前的旧属性值 +- 赋值后的新属性值 + + +如果你要观察一个属性的变化过程,那么可以将属性委托给`Delegates.observable`。 + + `observable`函数原型如下: ```kotlin public inline fun observable(initialValue: T, crossinline onChange: (property: KProperty<*>, oldValue: T, newValue: T) -> Unit): @@ -947,9 +999,10 @@ fun test(){ -##### map映射 +##### map委托 + +Map委托常常用来将Map中的key-value映射到对象的属性中,这经常出现在解析JSON或者其他动态事情的应用中。 -一个常见的用例是在一个映射`map`里存储属性的值。这经常出现在像解析`JSON`或者做其他“动态”事情的应用中。在这种情况下,你可以使用映射实例自身作为委托来实现委托属性。 ```kotlin class User(val map: Map) { @@ -975,6 +1028,8 @@ class MutableUser(val map: MutableMap) { +委托模式是一种被广泛使用的设计模式,Kotlin的委托主要用来实现代码的重用,Kotlin默认支持委托模式,且不需任何模版方法。 + - [上一篇:4.Kotlin_表达式&关键字](https://github.com/CharonChui/AndroidNote/blob/master/KotlinCourse/4.Kotlin_%E8%A1%A8%E8%BE%BE%E5%BC%8F%26%E5%85%B3%E9%94%AE%E5%AD%97.md) - [下一篇:6.Kotlin_多继承问题](https://github.com/CharonChui/AndroidNote/blob/master/KotlinCourse/6.Kotlin_%E5%A4%9A%E7%BB%A7%E6%89%BF%E9%97%AE%E9%A2%98.md) diff --git "a/KotlinCourse/7.Kotlin_\346\263\250\350\247\243&\345\217\215\345\260\204&\346\211\251\345\261\225.md" "b/KotlinCourse/7.Kotlin_\346\263\250\350\247\243&\345\217\215\345\260\204&\346\211\251\345\261\225.md" index 50ff4d0a..a800a8d3 100644 --- "a/KotlinCourse/7.Kotlin_\346\263\250\350\247\243&\345\217\215\345\260\204&\346\211\251\345\261\225.md" +++ "b/KotlinCourse/7.Kotlin_\346\263\250\350\247\243&\345\217\215\345\260\204&\346\211\251\345\261\225.md" @@ -327,6 +327,8 @@ text.panddingH = 100 扩展属性与扩展函数一样,其本质也是对应Java中的静态方法。由于扩展没有实际的将成员插入类中,因此对扩展属性来说幕后字段是无效的。 +扩展属性允许定义在类或者Kotlin文件中,但不允许定义在函数中。 因为扩展属性不能有初始化器,所以只能由显式提供的getter/setter定义,而且扩展属性只能被声明为val。 + ##### 静态扩展 @@ -1205,6 +1207,12 @@ class Group(val name: String) { `KDoc`不支持`@deprecated`这个标签。作为替代,请使用`@Deprecated`注解。 +### 泛型 + +通配符类型参数 `? extends E`表示该方法接收E类型或者E类型的一些子类型,而不仅仅是E类型本身。 +Kotlin抛弃了通配符类型这一概念,转而引入了生产者和消费者的概念,其中,生产者表示那些只能读取数据的对象,使用表达式`out T`标记。 +消费者表示那些只能写入数据的对象,使用表达式`in T`标记。 +为了便于理解,可以简单的将`out T`理解为`? exnteds T`,将`in T`理解为`? super T`。 diff --git "a/OperatingSystem/AndroidKernal/2.Android\347\272\277\347\250\213\351\227\264\351\200\232\344\277\241\344\271\213Handler\346\266\210\346\201\257\346\234\272\345\210\266.md" "b/OperatingSystem/AndroidKernal/2.Android\347\272\277\347\250\213\351\227\264\351\200\232\344\277\241\344\271\213Handler\346\266\210\346\201\257\346\234\272\345\210\266.md" index 424a31dd..b571b6f3 100644 --- "a/OperatingSystem/AndroidKernal/2.Android\347\272\277\347\250\213\351\227\264\351\200\232\344\277\241\344\271\213Handler\346\266\210\346\201\257\346\234\272\345\210\266.md" +++ "b/OperatingSystem/AndroidKernal/2.Android\347\272\277\347\250\213\351\227\264\351\200\232\344\277\241\344\271\213Handler\346\266\210\346\201\257\346\234\272\345\210\266.md" @@ -544,6 +544,11 @@ public final void removeCallbacksAndMessages(@Nullable Object token) { +##### postAtFrontOfQueue():将消息插入到队列头部 + +通过调用sendMessageAtFrontOfQueue计入一个when为0的message到队列,即插入到队列的头部。可以尽量保证快速执行。 + + ## MessageQueue类的常用方法 MessageQueue非常重要,因为quit、next等都最终调用的是MessageQueue类: diff --git a/README.md b/README.md index 234020ac..8604e003 100644 --- a/README.md +++ b/README.md @@ -722,7 +722,7 @@ Android学习笔记 [341]: https://github.com/CharonChui/AndroidNote/blob/master/VideoDevelopment/%E8%A7%86%E9%A2%91%E5%B0%81%E8%A3%85%E6%A0%BC%E5%BC%8F/AVI.md "AVI" [342]: https://github.com/CharonChui/AndroidNote/tree/master/VideoDevelopment/OpenCV "OpenCV" [343]: https://github.com/CharonChui/AndroidNote/blob/master/VideoDevelopment/OpenCV/1.OpenCV%E7%AE%80%E4%BB%8B.md "1.OpenCV简介" -[344]: "MediaMetadataRetriever" +[344]: https://github.com/CharonChui/AndroidNote/blob/master/VideoDevelopment/Android%E9%9F%B3%E8%A7%86%E9%A2%91%E5%BC%80%E5%8F%91/MediaMetadataRetriever.md "MediaMetadataRetriever"