kotlin基础【2】

变量类型

varval 的核心区别:

|-------|----------------|--------|-----------------|
| 关键字 | 含义 | 能否重新赋值 | 类似概念(Java) |
| var | variable(可变变量) | 可以 | 普通变量(无 final) |
| val | value(不可变变量) | 不可以 | 被 final 修饰的变量 |

var声明的变量可以被修改

Kotlin 复制代码
var age = 20
age = 21  // 合法,允许重新赋值

val 声明的变量不能修改:

Kotlin 复制代码
val name = "Kotlin"
name = "Java"  // 编译报错!不允许重新赋值
  • val 声明的变量虽然不能重新赋值,但如果它是对象(如集合、类实例),对象内部的属性是可以修改的:

    Kotlin 复制代码
    val list = mutableListOf(1, 2, 3)
    list.add(4)  // 合法,修改的是对象内部数据,不是重新赋值变量
    // list = mutableListOf(5,6)  // 编译报错,不允许重新赋值变量本身

Set

定义了一个私有不可变接受Int类型的Set对象ACTION_IDS_DEFAULT,setOf(...)是Kotlin 的集合创建函数,用于初始化一个不可变集合,括号中是具体的事件 ID(通常来自枚举的 id 属性)。

Kotlin 复制代码
private val ACTION_IDS_DEFAULT: Set<Int> = setOf(
    ActionTypeEnum.ACTION_START_CONNECTION.actionId,
    ActionTypeEnum.ACTION_STOP_SERVICE.actionId,
    ActionTypeEnum.ACTION_REFRESH_DATA.actionId,
    ActionTypeEnum.ACTION_CLEAR_CACHE.actionId,
    ActionTypeEnum.ACTION_UPDATE_SETTINGS.actionId,
    ActionTypeEnum.ACTION_SAVE_CONFIG.actionId,
    ActionTypeEnum.ACTION_RESET_DEVICE.actionId,
    ActionTypeEnum.ACTION_SYNC_STATUS.actionId
)

如何定义一个java的枚举类型:

java 复制代码
public enum EventIdEnum {
    // 事件类型枚举值,包含事件ID和事件描述两个成员变量
    EVENT_UPDATE_CONNECT_STATUS(1001, "连接状态更新事件"),
    EVENT_UPDATE_DEVICE_INFO(1002, "设备信息更新事件"),
    EVENT_UPDATE_SUPPORT_DESKTOP(1003, "桌面支持状态更新事件"),
    EVENT_UPDATE_HISTORY_DEVICE(1004, "历史设备列表更新事件"),
    EVENT_UPDATE_APP_LIST(1005, "应用列表更新事件"),
    EVENT_UPDATE_APP_INFO_CHANGED(1006, "应用信息变更事件"),
    EVENT_UPDATE_LINK_APP_SHOW_ALL_MENU(1007, "链接应用菜单显示事件"),
    EVENT_UPDATE_MEDIA_POSITION(1008, "媒体播放位置更新事件"),
    EVENT_UPDATE_MEDIA_STATUS(1009, "媒体播放状态更新事件"),
    EVENT_UPDATE_MEDIA_MODE(1010, "媒体模式更新事件"),
    EVENT_UPDATE_MEDIA_META_DATA(1011, "媒体元数据更新事件");

    // 事件ID字段
    private final int eventId;
    // 事件描述字段
    private final String description;

    // 包含两个参数的构造函数
    EventIdEnum(int eventId, String description) {
        this.eventId = eventId;
        this.description = description;
    }

    // 获取事件ID的方法
    public int getEventId() {
        return eventId;
    }

    // 获取事件描述的方法
    public String getDescription() {
        return description;
    }
}

构成一个java枚举类型的部分:

成员变量,实现的类型,构造函数,get方法

单例对象:

kt可以使用object关键字直接定义一个单例对象,在别的函数中可以直接使用类名来获得这个对象,不需要定义getInstance函数来获取这个对象

java 复制代码
// 使用 object 关键字创建单例
object AppConfig {
    // 单例中的成员变量
    var apiBaseUrl: String = "https://api.example.com"
    var timeout: Int = 30000 // 30秒
    
    // 单例中的方法
    fun init(baseUrl: String, timeout: Int) {
        this.apiBaseUrl = baseUrl
        this.timeout = timeout
    }
    
    fun getFullUrl(endpoint: String): String {
        return "$apiBaseUrl/$endpoint"
    }
}

方法的重写

使用override关键字

Kotlin 复制代码
override fun onReceivedPublishedData(
    packageName: String?, 
    eventIdentifier: Int, 
    dataBytes: ByteArray?
) {
    // 重写的方法实现逻辑
    // 可以调用父类实现(如果需要)
}

可以看出方法接受一个可以为空的String类型的packageName,Int 类型的eventIdentifier,可以为空的Byte类型数组(在上一节提过)

ByteArray 是一个字节数组类型,用于存储原始的字节数据。它与 Java 中的 byte[] 是兼容的(可以直接互操作),常用于处理二进制数据,比如网络传输、文件读写、加密解密等场景。

日志打印

Kotlin 复制代码
 Logger.warning(TAG, "Data is null!")

同java相似不赘述

主线操作

ThreadUtils.runOnMainThread { ... }:这是一个工具类方法,用于将代码块切换到主线程执行。

Kotlin 复制代码
// 将 eventId 替换为 currentEvent,类型仍为 EventIdEnum
when (currentEvent) {
    EventIdEnum.EVENT_UPDATE_CONNECT_STATUS -> 
        ThreadUtils.runOnMainThread {
            onConnectionStatusChanged(packageName, dataJson)
        }

    EventIdEnum.EVENT_UPDATE_DEVICE_INFO -> 
        ThreadUtils.runOnMainThread {
            onDeviceInfoUpdated(packageName, dataJson)
        }

    EventIdEnum.EVENT_UPDATE_SUPPORT_DESKTOP -> 
        ThreadUtils.runOnMainThread {
            onDesktopSupportChanged(packageName, dataJson)
        }

    EventIdEnum.EVENT_UPDATE_HISTORY_DEVICE -> 
        ThreadUtils.runOnMainThread {
            onHistoryDeviceListUpdated(packageName, dataJson)
        }

    EventIdEnum.EVENT_UPDATE_APP_LIST -> 
        ThreadUtils.runOnMainThread {
            onAppListUpdated(packageName, dataJson)
        }
}

什么操作需要放在主线程?

涉及到更新UI页面的操作,这些调用的函数会引起UI界面的改变,所以需要放在主线程

其他长时间且不直接涉及UI界面改变的可以放在子线程

when语句

Kotlin 复制代码
when (it.dataCategory) {
    CategoryTypeConfig.TYPE_FIRST_SYSTEM -> {
        DataSourceConstants.SOURCE_PRIMARY_SYSTEM
    }

    CategoryTypeConfig.TYPE_SECONDARY_TOOL -> {
        DataSourceConstants.SOURCE_AUXILIARY_TOOL
    }

    CategoryTypeConfig.TYPE_THIRD_PARTY -> {
        DataSourceConstants.SOURCE_EXTERNAL_MODULE
    }

    else -> {
        DataSourceConstants.SOURCE_EXTERNAL_MODULE
    }
}

when语句这一段实际上返回的是一个变量,所以when语句可以这么写

Kotlin 复制代码
var data = when (it.dataCategory) {
    CategoryTypeConfig.TYPE_FIRST_SYSTEM -> {
        DataSourceConstants.SOURCE_PRIMARY_SYSTEM
    }

    CategoryTypeConfig.TYPE_SECONDARY_TOOL -> {
        DataSourceConstants.SOURCE_AUXILIARY_TOOL
    }

    CategoryTypeConfig.TYPE_THIRD_PARTY -> {
        DataSourceConstants.SOURCE_EXTERNAL_MODULE
    }

    else -> {
        DataSourceConstants.SOURCE_EXTERNAL_MODULE
    }
}

也可以把它作为一个参数传给一个函数

Kotlin 复制代码
callback.onProgress(
    when (it.itemType) {
        ItemTypeConfig.TYPE_STANDARD -> {
            ResourceType.SOURCE_STANDARD
        }

        ItemTypeConfig.TYPE_ENHANCED -> {
            ResourceType.SOURCE_ENHANCED
        }

        ItemTypeConfig.TYPE_PREMIUM -> {
            ResourceType.SOURCE_PREMIUM
        }

        else -> {
            ResourceType.SOURCE_PREMIUM
        }
    }, 100
);

lambda表达式放在下一章

相关推荐
雨白1 天前
Android 快捷方式实战指南:静态、动态与固定快捷方式详解
android
hqk1 天前
鸿蒙项目实战:手把手带你实现 WanAndroid 布局与交互
android·前端·harmonyos
LING1 天前
RN容器启动优化实践
android·react native
恋猫de小郭1 天前
Flutter 发布官方 Skills ,Flutter 在 AI 领域再添一助力
android·前端·flutter
Kapaseker1 天前
一杯美式搞懂 Any、Unit、Nothing
android·kotlin
黄林晴1 天前
你的 Android App 还没接 AI?Gemini API 接入全攻略
android
恋猫de小郭2 天前
2026 Flutter VS React Native ,同时在 AI 时代 VS Native 开发,你没见过的版本
android·前端·flutter
冬奇Lab2 天前
PowerManagerService(上):电源状态与WakeLock管理
android·源码阅读
BoomHe2 天前
Now in Android 架构模式全面分析
android·android jetpack
二流小码农2 天前
鸿蒙开发:上传一张参考图片便可实现页面功能
android·ios·harmonyos