1、前言

虽然有了解kotlin,但是一直没在项目中使用,最近为了学习Jetpack+组件化,新开了个练习项目,顺便学一下kotlin,记录下学习路线。

2、学习路线

2.1、语言学习

主要学一下基本语法:

官方中文文档:https://www.kotlincn.net/docs/reference/

2.2、Android中的学习

kotlin在android中的使用:

google官方文档:https://developer.android.google.cn/kotlin/add-kotlin

看完差不多够用了

2.3、协程

协程可以用同步的方式编写异步的代码(减少回调),在Android中如网络请求,文件io,数据库等。协程比线程更轻量,线程是全局的,但是协程可以指定作用域,在Android中利用viewModelScope或者lifecycleScope可以感知activity生命周期,并自动取消协程。

viewModelScope.launch{//主线程启动一个协程val data = repository.fetchData()  //网络请求//更新UItextView.text = data.title
}

更多可以参考google开源项目:sunflower

2.4、扩展函数

kotlin提供了很多扩展函数,比如apply、run等,也可以自定义,如

/*** 图片加载扩展方法*/
fun ImageView.load(url: String) {Glide.with(this).load(url).into(this)
}imageView.load("http://xxxxx.png")
/*** 根据手机的分辨率将dp转成为px。*/
val Float.dp2pxget() = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,this,Resources.getSystem().displayMetrics)
//使用
20f.dp2px

3、网络请求简单封装

3.1、封装响应类

/*** 用密封类sealed封装响应数据类*/
sealed class ApiResult<out T : Any> {//获取数据成功data class Success<out T : Any>(val data: T) : ApiResult<T>()//失败data class Error(val exception: Exception) : ApiResult<Nothing>()
}//请求数据
viewModelScope.launch{//主线程启动一个协程try{val data = repository.fetchData()  //网络请求//更新UItextView.text = data.data.title} catch(e : Exception){//请求失败...}
}

3.2、统一处理异常

对于每个网络请求,显然不能每个都加异常处理,可以通过高阶函数,统一处理异常。(高阶函数:一个函数可以将另一个函数当作参数)

/*** 统一处理网络请求异常* [call]:网络请求方法:suspend方法,返回数据类型为泛型T* [errorMsg]:错误信息* 返回类型:ApiResult<T> 可能为Success也可能为Error*/
suspend fun <T : Any> request(call: suspend () -> T, errorMsg: String): ApiResult<T> =try {//请求成功ApiResult.Success(call())} catch (e: Exception) {//请求失败ApiResult.Error(Exception(errorMsg, e).also { e.printStackTrace() })}//请求数据
/*** 三者关系:ViewModel持有Repository,Repository持有ApiService,ApiService执行网络请求*/
//retrofit网络请求接口
interface Api {/*** 获取数据*/@GETsuspend fun fetchData(@Url url: String = "http://xxx"): Data
}//repository类
class Repository() {/*** 获取数据*/suspend fun fetchData() =request(call = {//网络请求apiService.fetchData()}, errorMsg = "请求失败")
}//viewModel类
viewModelScope.launch{//主线程启动一个协程val data = repository.fetchData()  //网络请求when(data){is ApiResult.Success ->{ //更新Ui ,或者封装成LiveData发送数据textView.text= data.data.title}is ApiResult.Error ->{ //错误提示data.exception.print()}}
}

4、网络请求简单封装(flow篇)

如果用flow,可以以更简单的方式封装

// 添加个顶级函数
fun <T : Any> requestFlow(call: suspend () -> T,onSuccess: (T) -> Unit,onStart: () -> Unit = {},onComplete: () -> Unit = {},onError: (Throwable) -> Unit = {}
) = flow {emit(call())
}.flowOn(Dispatchers.IO)   // 在子线程执行.onStart {onStart()}.catch { ex ->onError(ex)}.onCompletion {onComplete()}.onEach {             // 分离消费onSuccess(it)}// 使用
override fun fetchData() {requestFlow({// 网络请求repository.fetchData()}, {                // 请求成功_discoveryData.value = it}, onStart = {      // 请求开始_onRefreshing.value = true_onError.value = false}, onComplete = {   // 请求完毕_onRefreshing.value = false}, onError = {      // 请求失败_onError.value = true}).launchIn(viewModelScope)
}

Kotlin in Android入门实践相关推荐

  1. kotlin开发Android入门篇八Kotlin开发Android的基本使用

    基础篇:Kotlin开发Android的基本使用 使用AndroidStudio3.0及以上开发Kotlin在新建项目中勾选这个选项则会默认开发语言为Koltin,然后再gradle(Project的 ...

  2. kotlin开发Android入门篇一

    基础篇:基本类型及方法的定义 kotlin介绍:Kotlin是一个基于JVM 的新的编程语言,由JetBrains 开发. Kotlin可以编译成Java字节码,也可以编译成JavaScript,方便 ...

  3. android hook底层代码_Java-Hook技术-入门实践(反射、动态代理)-Hook拦截通知(当前App/Context)...

    老样子,上一篇MonkeyLei:Java-Hook技术-入门实践+反射.动态代理.热修复再看看 我们Hook学习了一下,一个是Java本地Main的实践练习. 一个是Android的监听事件的Hoo ...

  4. Android: Kotlin 材料设计入门

    原文:Android: Kotlin 材料设计入门 作者:Joe Howard 译者:kmyhy 更新说明:本教程由 Joe Howard 升级为 Kotlin.原教程作者是 Megha Bambra ...

  5. android ndk 界面开发教程,AndroidStudio NDK开发最佳入门实践

    AndroidStudio NDK开发最佳入门实践 网上一些介绍AndroidStudio NDK入门的教程,感觉都不是很完整和全面,也没有告诉初学AndroidStudio NDK的同学们一些需要注 ...

  6. 最强Android入门开发指南,帮你打通Android的任督二脉

    Android 新手想要入门,很容易会遇到各类困难和学习瓶颈.没有一个好学的学习方向,学习规划,学习教程,这都是新手会面临的问题. 很多人会在百度上搜索,查阅相关资料.但是网上搜索的很多资料,都是断片 ...

  7. 如果你现在学Android---学习使用Kotlin进行Android开发

    原文地址: http://www.eoeandroid.com/thread-902176-1-1.html?_dsign=650ea146 之前写了一篇<如果你现在学Android–写给新手的 ...

  8. Java vs Kotlin,Android开发人员应该选择哪种语言?

    自 Google 于 2017 年宣布 Kotlin 成为 Google IO 的 Android 开发官方语言以来,想要成为Android开发人员的程序员正陷入两难境地. 在讨论这个问题前,我首先要 ...

  9. WEB入门实践-张晨光-专题视频课程

    WEB入门实践-256人已学习 课程介绍         WEB开发入门编程,从各种开发工具的讲解到html标签,css元素讲解,js课程系列. 课程收益     培养web开发技术人才 讲师介绍   ...

最新文章

  1. 【灵动直播提醒】全国大学生智能车竞赛培训(一)——灵动MM32SPIN27介绍
  2. 撩课-Java每天5道面试题第12天
  3. ejabberd登陆不成功的解决方案
  4. android操作系统 真的吗_旋挖机培训学校真的能学会吗,旋挖钻机到底有哪些操作系统...
  5. 从 Google Code 迁移代码到 GitHub 上
  6. Linux下解压rar格式文件
  7. 前端vue的基础使用模板
  8. 07. Java中的类和对象(嗜血无敌战神破解版)
  9. 采用WPF开发第二版OFD阅读器,持续完善中,敬请期待
  10. 2022 AI趋势8大预测
  11. amazon实例 更改密钥_如何更改Amazon Echo的警报声音
  12. Hdu2184汉诺塔VIII
  13. flash绘制矢量人物教程
  14. 对WXin执行回插入代码后的回编译操作
  15. 工业视觉检测入门——如何设计一个合适的检测方案?(需求分析+光学设计+检测算法+UI交互+后端数据)
  16. 语音如何转文字?建议收藏这些方法
  17. 中南林注册教育邮箱加获取JetBrains个人许可证,续订许可证
  18. unity获取电磁笔压感_一种智能终端电磁压感笔的制作方法
  19. springboot 0709
  20. 站长号文库:什么是云存储?

热门文章

  1. 如何用短信营销打动客户
  2. 各个手机尺寸对应的像素
  3. Excel单元格如何增加下拉选项(类似于web中的select选项框)
  4. VMware Workstation中桥接模式、NAT模式、仅主机模式
  5. Duplicated tag: ‘mirrors‘
  6. Java:Redis分布式缓存
  7. 微信小程序源码丢失了如何找回微信小程序源码?
  8. 支付宝小程序my.navigateTo或my.switchTab带参数跳转介绍
  9. c linux strcasecmp
  10. 中国最唯美的9首古老情诗