Kotlin学习记录

这篇具有很好参考价值的文章主要介绍了Kotlin学习记录。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1. 权限修饰符

除了java的 publicprotecteddefaultprivate 外,又有独特的 internalopen 修饰符。

1.1 internal 修饰符

直译为内部的,访问范围是当前模块可见。使用示例:

// 可以对类修饰
internal class MapboxNavigationAppDelegate { }

// 可以对常量修饰,val 为申明常量,var 为申明变量
internal val carAppLifecycleObserver = object : DefaultLifecycleObserver { }

// 可以对构造方法和变量修饰
class EtcGateApi internal constructor(
    internal var experimental: com.mapbox.navigator.Experimental
) {  }

1.2 open 修饰符

默认情况下 class 和成员都是具备 final 修饰符的,即无法被继承和复写。
如果可以被继承或复写,需要添加 open 修饰。使用示例:

open class AutoArrivalController : ArrivalController { }

open fun nextChain(chain: AudioTypeResolver) {  }

更多kotlin权限修饰符介绍参考

2 其它修饰符

2.1 lateinit 修饰符

  • 延迟初始化,但又相当于有java中的 @NotNull 注解,所以在使用之前必须已经实例化,否则会报错。
  • lateinit 不能用来修饰基本数据类型,因为基本类型的属性在类加载后的准备阶段都会被初始化为默认值。
  • lateinit不能修饰val常量,只能修饰可变的属性。

2.2 inline 修饰符

inline——内联函数修饰符

inline fun logI(category: String? = null, lazyMsg: () -> String) {
    if (logLevel().accepts(LoggingLevel.INFO)) {
        logI(lazyMsg(), category)
    }
}

2.3 var 修饰符 (变量)

2.4 val 修饰符 (常量)

2.5 typealias

它的作用十分简单,给已有类型取一个别名,可以像使用原类型一样使用这个 “类型别名” 。

private typealias SDKRoadGraphVersionInfo = com.mapbox.navigation.core.RoadGraphVersionInfo

3 申明对象

3.1 申明对象不赋值

private lateinit var navigationCamera: NavigationCamera

3.2 申明对象并实例化

// 基本类型
private var clearingPlayedEvents = false

// Class对象
private var historyTimeOffset: Double = 0.0
private val navigationLocationProvider = NavigationLocationProvider()
private var currentJob: Job? = null

3.3 申明常量并用 by lazy 懒加载

类似 lateinit 修饰符 ,但这个懒加载用来申明常量,而 lateinit 修饰符 只能用来申明变量。

private val overviewPadding: EdgeInsets by lazy {
    EdgeInsets(
        140.0 * pixelDensity,
        40.0 * pixelDensity,
        120.0 * pixelDensity,
        40.0 * pixelDensity
    )
}

4 类、接口、object、fun、const

这五种都可以单独定义在一个.kt文件中,也可以多种类型组合。

4.1 class

// 实现了LoggerFrontend接口的 MapboxCommonLoggerFrontend 类
internal class MapboxCommonLoggerFrontend : LoggerFrontend {  }

// 继承某个类需要后面加(),还有实现的其它接口用逗号隔开添加
class MapboxNavigationActivity : AppCompatActivity(), OnClickListener {  }

// 带构造参数的类定义,有些参数是常量,被传入后不再能修改,有些参数被直接定义,并且是用其它的参数来构造
class NavigationCamera(
    mapboxMap: MapboxMap,
    private val cameraPlugin: CameraAnimationsPlugin,
    private val viewportDataSource: ViewportDataSource,
    private val stateTransition: NavigationCameraStateTransition =
        MapboxNavigationCameraStateTransition(mapboxMap, cameraPlugin)
) {  }

// 带构造参数的类定义,用 constructor 的方式
class RoadGraphVersionInfo internal constructor(val dataset: String, val version: String) {  }

// constructor 定义其它的构造函数
class MapboxNavigation @VisibleForTesting internal constructor(
    val navigationOptions: NavigationOptions,
    private val threadController: ThreadController,
) {

    constructor(navigationOptions: NavigationOptions) : this(navigationOptions, ThreadController())
    
}

4.2 interface

将接口作为一个常量实现,如果接口只有一个方法,可以 = 接口名{ 实现方法 };如果有多个方法要 = object : 接口名{ 实现方法 }文章来源地址https://www.toymoban.com/news/detail-708503.html

interface Time { }

4.3 object

object InternalJobControlFactory { 
    // 内部可以定义fun和const
    fun createDefaultScopeJobControl(): JobControl {
        val parentJob = SupervisorJob()
        return JobControl(parentJob, CoroutineScope(parentJob + Dispatchers.Default))
    }
}

4.4 fun

package com.mapbox.navigation.utils.internal

import android.location.Location
import com.mapbox.geojson.Point

fun Location.toPoint(): Point {
    return Point.fromLngLat(this.longitude, this.latitude)
}

4.5 const

package com.mapbox.navigation.utils.internal

const val NOTIFICATION_CHANNEL = "Navigation Notifications"
const val NAVIGATION_NOTIFICATION_CHANNEL = "NAVIGATION_NOTIFICATION_CHANNEL"
const val END_NAVIGATION_ACTION = "com.mapbox.intent.action.END_NAVIGATION"
const val SET_BACKGROUND_COLOR = "setBackgroundColor"
const val NOTIFICATION_ID = 7654

5 suspend挂起函数,必须在Coroutine协程中使用

private suspend fun simulateEvents(replayEventsCallback: (List<ReplayEventBase>) -> Unit) {
    val loopStart = timeSeconds()

    val replayEvents = movePivot(loopStart)
    if (replayEvents.isNotEmpty()) {
        replayEventsCallback(replayEvents)
    }
    val loopElapsedSeconds = timeSeconds() - loopStart
    val loopElapsedMillis = (loopElapsedSeconds * MILLIS_PER_SECOND).roundToLong()
    val delayMillis = max(0L, REPLAY_UPDATE_SPEED_MILLIS - loopElapsedMillis)
    delay(delayMillis)
}


fun launchSimulator(replayEventsCallback: (List<ReplayEventBase>) -> Unit): Job {
    resetSimulatorClock()
    return jobControl.scope.launch { // 协程中使用
        while (isActive) {
            if (isDonePlayingEvents()) {
                delay(IS_DONE_PLAYING_EVENTS_DELAY_MILLIS)
            } else {
                simulateEvents(replayEventsCallback) // 上面的挂起函数调用
            }
        }
    }.also {
        currentJob = it
    }
}

// InternalJobControlFactory是object,提供了main、default、io线程的协程JobControl获取
private val jobControl = InternalJobControlFactory.createMainScopeJobControl()

到了这里,关于Kotlin学习记录的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【错误记录】Android Studio 创建 Module 模块报错 ( Cannot resolve external dependency org.jetbrains.kotlin:kotl )

    目前使用的是 最新的 Gradle 配置 , 创建 Module 生成的源码与 Gradle 配置出现了冲突 , 导致的问题 ; 解决此类问题 , 要仔细检查 Gradle 构建脚本 , 排查每个依赖库的来源 ; 本次错误就是 AS 系统自动成的 Module 修改了 Gradle 构建脚本 , 导致依赖下载失败 ; 在 Android Studio 的 已存在 工

    2024年02月08日
    浏览(55)
  • 【错误记录】Android Studio 编译报错 ( Module was compiled with an incompatible version of Kotlin. The binary )

    Android Studio 工程在编译时 , 报如下错误 : 直接把报错信息翻译一下 : 报错的模块是 e: C:/Users/octop/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-stdlib-common/1.7.10/bac80c520d0a9e3f3673bc2658c6ed02ef45a76a/kotlin-stdlib-common-1.7.10.jar!/META-INF/kotlin-stdlib-common.kotlin_module 模块 , 就是 kotlin-stdlib-c

    2024年01月20日
    浏览(51)
  • 安卓学习笔记之五:Android Studio_骰子案例3(Kotlin搭配 Jetpack Compose实现)

    使用 Compose 创建一款交互式  Dice Roller  Android 应用。 完成: 定义可组合函数。 使用组合创建布局。 使用  Button  可组合项创建按钮。 导入  drawable  资源。 使用  Image  可组合项显示图片。 使用可组合项构建交互式界面。 使用  remember  可组合项将组合中的对象存储到内

    2024年02月20日
    浏览(48)
  • 记录一下Kotlin: Module was compiled with an incompatible version of Kotlin.的问题

    我遇到的整个报错是这样的: Error:Kotlin: Module was compiled with an incompatible version of Kotlin. The binary version of its metadata is 1.7.1, expected version is 1.1.16. 大概意思就是不匹配,但是我这是个不太能随便改代码的项目,而且我是突然出现的这个问题,原本是可以正常启动的,所以我就找只

    2024年02月15日
    浏览(47)
  • Android Kotlin 协程初探

    维基百科:协程,英文Coroutine [kəru’tin] (可入厅),是计算机程序的一类组件,推广了协作式多任务的子程序,允许执行被挂起与被恢复。 作为Google钦定的Android开发首选语言Kotlin,协程并不是 Kotlin 提出来的新概念,目前有协程概念的编程语言有Lua语言、Python语言、Go语言

    2024年02月08日
    浏览(45)
  • 【采坑记录】kotlin compiler embeddable 下载超级慢

    今天碰到一个奇怪的问题:在家里用自己的电脑更新下公司的项目,突然发现重新构建工程时一直在跑下载kotlin compiler embeddable 的task,期间打了两把王者农药还没跑完就离谱,于是尝试了如下方案。 尝试方案1:gradle配置阿里云仓库 当时我是这样想的:kotlin compiler embeddable这

    2024年02月13日
    浏览(32)
  • Android开发中,JDK版本,Gradle版本,Kotlin插件与Kotlin版本等各自对应关系

    一、Gradle版本和Java版本对应关系 二、Gradle版本和Kotlin版本对应关系 三、Gradle版本和Gradle插件版本匹配关系 可以在Android Studio的 File Project Structure Project 菜单中指定插件版本,也可以在顶级 build.gradle 文件中进行修改

    2024年03月15日
    浏览(67)
  • Android AlertDialog setView,kotlin

    Android AlertDialog setView,kotlin             Android DialogFragment(1)_zhangphil的博客-CSDN博客 Android DialogFragment(1)和过去的AlertDialog类似,Android引入的DialogFragment旨在为开发者提供一个“富”dialog,而不必受到过去Android AlertDialog的局限。首先,DialogFragment是一个Fragment,它有Fragm

    2024年02月13日
    浏览(58)
  • Android-实现一个登录页面(kotlin)

    首先,确保你已经安装了 Android Studio。如果还没有安装,请访问 Android Studio 官网 下载并安装。 - 安装并配置好 Android Studio gradle-wrapper.properties build.gradle(:Project) setting.gradle - 对 Kotlin 语言有基本了解 首先,打开 Android Studio 并创建一个新项目。选择 \\\"Empty Activity\\\" 模板,然后为项

    2023年04月25日
    浏览(42)
  • Android Glide CustomTarget ,kotlin

    Android Glide CustomTarget ,kotlin       android Glide CustomViewTarget,java_zhangphil的博客-CSDN博客 【代码】android Glide CustomViewTarget,java。 https://blog.csdn.net/zhangphil/article/details/129493334 Android Glide预加载preload ,kotlin_zhangphil的博客-CSDN博客 【代码】Android Paging 3,kotlin(1)在实际的开发中,虽然G

    2024年02月16日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包