一、全局变量(lateinit)

我们经常会抽取一些全局变量方便类中局部调用(view,adapter等),但对属性设置默认为 null 的话,在调用的时候不得不手写大量的非空调用来满足 Kotlin 的空指针检查,即便你明确它不会为null(在 onCreate() 中有初始化过)。

这个时候使用延迟初始化关键字lateinit ,告诉编译器我们会在晚些时候进行初始化,就不用一开始赋值为null。但是一定要确保调用前有被初始化,否则报错UninitializedPropertyAccessException,可以使用代码【::变量名.isInitalized】先做判断是否初始化过。

UI {private lateinit var adapter: MyAdapteroverride fun onCreate(savedInstanceState: Bundle?) {//直接初始化adapter = MyAdapter(list)//判断再赋值,避免重复初始化if(!::adapter.isInitialized) { adapter = MyAdapter(list) }}override fun onClick(v: View?) {adapter.notifyDataSetChanged()}
}

二、延迟初始化(by lazy)

  • 使用场景:当某个对象或属性不必在类加载的时候就初始化,而是等到调用它的时候再初始化,线程安全。
  • 需要注意:与生命周期相关的方法都是在主线程,在其中调用的东西会立即初始化和线程安全,因此没必要使用。

三、ViewHolder(密封类)

由于编译器知道一共有几种类型,可用来优化 when 对分支的判断:

  • 后期新增holder,译器会提醒未穷举不给通过,不用担心忘记修改 when 判断最后走了 else 默认情况。
  • 很明确只存在几种holder,却为了满足编译器的要求写 else 无效的默认分支。

①新建一个 MsgHolder.kt,编写各种holder。

//定义一个密封类继承自RecyclerView.ViewHolder
sealed class MsgHolder(view: View) : RecyclerView.ViewHolder(view)
//让实际用到的holder去继承它
class LeftHolder(view: View) : MsgHolder(view) {val tv: TextView = view.findViewById(R.id.tv_left)
}
class RightHolder(view: View) : MsgHolder(view) {val tv: TextView = view.findViewById(R.id.tv_right)
}
//将 Adapter 的泛型指定为我们定义的 MsgHolder
class MsgAdapter(val list: List<Mag>) : RecyclerView.Adapter<MsgHolder>() {override fun onBindViewHolder(holder: MsgHolder, position: Int) {//判断的时候就能不写else分支when (holder) {is LeftHolder -> ...is RightHolder -> ...}}
}

四、Json字段关联不同名称的属性(Data Class)

//Json
"formatted_address":"中国北京市"
//Data Class
data class Place(@SerializedName("formatted_address") val address: String)

五、获取全局Context(Application)

由于在一些地方无法调用API获取Context:

  1. 创建一个 GlobalApplication 类继承自 Application。
  2. 伴生对象中定义 context 属性,重写 onCreate() 函数,调用 getApplicationContext() 将获取到的上下文赋值给 context。
  3. Activity、Service这样的 Context 设置成静态容易造成内存泄漏,但我们这里获取的是 Application 中的 Context,全局只有一份切在整个APP生命周期内不会被回收因此不存在该风险,使用注解忽略 IDE 警告。
  4. 一定要在 Manifest 中配置我们自定义的!
class GlobalApplication : Application() {companion object {@SuppressLint("StaticFieldLeak")    //注解忽略警告lateinit var context: Context    //写在伴生对象里才能静态调用,但这里无法调用获取函数所以用lateinitprivate set    //收窄权限}override fun onCreate() {super.onCreate()context = applicationContext    //在APP创建的时候就赋值}
}//别忘了在Manifest中配置
<applicationandroid:name=".GlobalApplication">
</application>

六、

Android - 一些Kotlin写法相关推荐

  1. [Android]使用Kotlin开发Android(二)

    以下内容为原创,欢迎转载,转载请注明 来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/4829007.html [TOC] 使用Kotlin+OkHtt ...

  2. Android开发——Kotlin语言

    语法 变量 类型转换 "不安全的"转换操作符 "安全的"转换操作符 函数 一行代码的情况 运算符 位运算符 程序控制语句 选择结构 循环结构 类和对象 继承与构 ...

  3. 超越Android:Kotlin在后端的工作方式

    by Adam Arold 亚当·阿罗德(Adam Arold) 超越Android:Kotlin在后端的工作方式 (Going Beyond Android: how Kotlin works on ...

  4. 用Kotlin开发您的第一个应用程序| Android与Kotlin

    In the previous article, we learned how to setup Kotlin in the android studio? Now moving to journey ...

  5. kotlin android 4,Kotlin Android Extensions: 与 findViewById 说再见 (KAD 04)

    时间:Aug 16, 2017 原文链接:https://antonioleiva.com/kotlin-android-extensions/ 在 Kotlin1.1.4版本 发布后,原作者依据 K ...

  6. Android通讯录-kotlin

    前言 这学期上了移动智能开发,做了几个作业,虽然做得不是很理想,但是还是想记录一下,方便有些用法以后回来可查. android下载和配置见:android studio配置介绍 . 关键代码: And ...

  7. Android Studio - Kotlin 改变控件字体

    Android Studio - Kotlin 改变控件字体 如改变 textView 的字体( FontFamily ) val typeface = Typeface.createFromAsse ...

  8. android日记本-kotlin

    前言 这学期上了移动智能开发,做了几个作业,虽然做得不是很理想,但是还是想记录一下,方便有些用法以后回来可查. android下载和配置见:android studio配置介绍 . 关键代码: And ...

  9. android计时器正确写法,Android计时器正确应用方式解析

    昨天晚上在写一个Android计时器,开始认为很容易,用Java一般写法,结果发现计时器根本不能运行,但却不报任何错误,当时就呆在那了,不知道该怎么办了,后来在网上查了一下,Android考虑到线程安 ...

最新文章

  1. CSRankings全球排名第一的清华人工智能专业如何打造?听张钹院士娓娓道来
  2. IBM迎来新任CEO,又一美国科技巨头被印度裔掌舵
  3. 左侧固定右侧自动填充_办公小技巧:解决Excel公式自动填充问题
  4. np.newaxis——np.ndarray增加维数
  5. 新东方mti百科知识pdf_20南航翻硕mti初试417上岸经验贴
  6. 阿里开发者们的第13个感悟:工程师需要在循环迭代中成长
  7. 敏捷开发绩效管理之二:用中医理论管理团队及其绩效(绩效考核,团队管理,自组织团队)...
  8. ArcGIS Engine中删除要素的几种方法总结
  9. -Android的发展webservice-号码归属地查询
  10. golang json string remove field
  11. SPSS Sobel检验(图文+数据集)【SPSS 044期】
  12. jmeter监控服务器的方法
  13. tensorflow无法检测到GPU设备--英伟达控制面板显示未连接英伟达GPU的显示器
  14. 浅谈低成本视频动作捕捉技术
  15. mysql安装ecshop_ECSHOP安装流程
  16. linux环境变量设置详解
  17. 微信小程序引入字体图标 1
  18. Olny Flashlight
  19. 有道云笔记客户端不显示图片
  20. excel 画散点图 怎么设置图片的分辨率_Slynyrd像素画教程:像素画基础教程

热门文章

  1. 分位数和分位线(Quantiles and Percentiles)
  2. 万有引力调研报告 ———大学物理第二节课思考题一
  3. ATI显卡在everest0.5上安装的方法
  4. Matlab,solve函数出错,问题的解决
  5. 简单十招教你学会破解软件
  6. iOS:制作简易的 AAC 播放器 —— 了解音频的播放流程
  7. php 实现图形验证码,PHP实现图形验证码案例(1)
  8. 爬取《令人心动的offer2》13万弹幕,看网友是如何评价的
  9. 三国武将10大巅峰时刻
  10. 关于Oracle分区 报错ORA-01847