Kotlin使用DSL构建专有语法结构
DSL构建专有的语法结构DSL 是专为特定领域(如数据库查询、配置文件、UI布局等)设计的编程语言或语言的一个子集。Kotlin 提供了丰富的支持,帮助开发者用 Kotlin 代码构建出自己的 DSL 语言结构,以使得代码更加易读和易写。 扩展函数:你可以通过扩展函数给现有类添加自定义功能,从而实现新的语法结构。 高阶函数:Kotlin 允许将函数作为参数传递给其他函数,这使得定义和构建 DSL 成为可能。 Lambda 表达式:你可以通过 lambda 表达式使代码更加简洁,形成类似声明式的语法。 智能类型推断:这使得你无需显式声明类型,语法更清晰,推导更自然。 Lambda with Receiver(接收者 lambda)接收者 lambda 允许在 lambda 中访问外部对象的成员,而不需要显式的引用对象。通过这种方式,你可以通过一个语法块来访问和操作对象,类似于嵌套调用的结构。 1234567891011121314class DSL { fun sayHello() = println("Hello, World!")...
Jetpack(Kotlin)
JetpackJetpack全家福 ViewModel作用帮助Activity分担一部分工作,专门用于存放与界面相关的数据的,他可以保证在手机屏幕发生旋转时不会被重新创建,数据不会丢失 生命周期 用法 添加依赖 创建一个ViewModel类继承自ViewModel() 把界面相关的数据都放入其中 在Activity或fragment中创建其实例 构建相关逻辑 12implementation ("androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.2") // Kotlin 版本implementation ("androidx.lifecycle:lifecycle-viewmodel:2.6.2") // Java 版本 123class MainViewModel(countReserved: Int) : ViewModel() { var counter=0} 12345678910111213141516171819class MainActiv...
编写好用的工具
求N个数的最大最小值使用泛型实现Comparable接口,可以适用于任意类型数字比较 12345678910fun <T:Comparable<T>> max(vararg nums:T):T{ if(nums.isEmpty()) throw RuntimeException("Params can not be empty") var maxNum=nums[0] for(num in nums){ if(num>maxNum){ maxNum=num } } return maxNum} 简化Toast用法12345678//字符串调用fun String.showToast(context: Context,duration: Int=Toast.LENGTH_SHORT){ Toast.makeText(context,this,duration).show()&...
最美UI体验,Material Design(Kotlin)
各版块颜色的代表标识 Toolbar 在布局文件中使用 在活动中设置 12345678<androidx.appcompat.widget.Toolbar android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" android:background="?attr/colorPrimary" android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar" app:popupTheme="@style/ThemeOverlay.AppCompat.Light"//为弹出的菜单项设置主题 app:layout_scrollFlags="scroll|enterAlways|snap"/&...
Kotlin使用协程编写高效的并发程序
协程的基本用法 优点 协程允许我们在单线程模式下模拟多线程编程的效果 依赖库 1234// Gradle 依赖implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.8.0")//Android扩展implementation("org.jetbrains.kotlinx:kotlinx-coroutines-android:1.8.0") Global.launch函数创建协程作用域 Global.launch创建的是一个顶层协程,这种协程当应用程序结束时也会跟着结束 使用Thread.sleep可以让主线程堵塞一定时长 delay()可以让当前协程延长指定时间后再运行,是一个非阻塞式的挂起函数,只会挂起当前协程,对其他线程或协程无影响 最大的问题就是可能代码还没运行结束应用程序就结束了,代码运行强制中断 123456GlobalScope.launch { println("codes run in coroutine sco...
网络技术(Kotlin)
WebView 使用WebView控件 调用getSettings方法设置浏览器属性 传入WebViewClient实例 传入网址 声明网络权限 1234<WebView android:id="@+id/webView" android:layout_width="match_parent" android:layout_height="match_parent"/> 123456789101112131415161718class MainActivity : AppCompatActivity() { private lateinit var binding:ActivityMainBinding override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) enableEdgeT...
Kotlin泛型的高级特性
泛型的实化条件 内联函数 reified关键字修饰 举例 123inline fun <reified T> getGenericType(){ } 应用 启动活动 新建一个reified.kt文件 123456inline fun <reified T> startActivity(context:Context,block:Intent.()->Unit){ val intent= Intent(context,T::class.java) //高阶函数用于传递数据 intent.block() context.startActivity(intent)} 启动活动 1234startActivity<Test>(this){ putExtra("param1","data") putExtra("param2",123)...
Service(Kotlin)
多线程编程线程的四种形式 1234567class MyThread:Thread(){ override fun run(){ //编写具体逻辑 }}//启动MyThread.start() 12345678class MyThread:Runnable{ override fun run(){ //编写具体逻辑 }}//启动val myThread=MyThread()Thread(myThread).start() 123Thread{ //编写具体逻辑}.start() 123thread{ //编写具体逻辑} 最后一种是Kotlin内置的顶层函数,更加简单方便 在子线程中更新UI 定义一个整型变量表示更新UI的动作 新增一个Handler对象,重写父类handleMessage()方法,在这里对UI进行具体操作 开启子线程 创建Message对象 指定what字段值 调用sen...
Kotlin的infix函数
特点infix 关键字可以让 单参数的函数 以 更自然的语法 书写,使代码更易读。你可以把它理解为 一种特殊的调用方式,不需要 . 和 (),让代码像 自然语言 一样流畅。例如mapOf中的键值对(A to B实际等价于A.to(B))省略了 . 和 ()。 条件要使用 infix,需要满足 三个条件: 必须是成员函数或扩展函数(它必须属于某个类或某种类型)。 必须只有且只能有一个参数(如果有多个参数,就不能用 infix)。 ⭐⭐⭐⭐⭐⭐调用时可以省略 . 和 ()(但仍然可以用 . 调用)。 实例12345infix fun <T> Collection<T>.has(element:T)=contains(element)val list =listOf("Apple","Banana","Orange","Pear","Grape")if(list has "Banana"){ //处理具体逻辑}...
手机多媒体(Kotlin)
通知(进阶) 创建通知渠道 12345678910111213val manager=getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O){ /*参数介绍: 1.渠道id 2.渠道名称 3.重要等级 */ val channel=NotificationChannel("normal","Normal",NotificationManager.IMPORTANCE_DEFAULT) val channel2=NotificationChannel("important","Important",NotificationManager.IMPORTANC...














