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. 看动画轻松理解“递归”与“动态规划”
  2. c++服务器开发学习--02--MySQL,Redis,ASIO,iocp,TrinityCore代码结构,c++对象模型
  3. 学习asp.net ajax 笔记(一)
  4. linux消息队列的使用
  5. 操作软件_如何提升办公软件的操作能力
  6. Product ID Not in valid range
  7. lseek函数的使用
  8. pq分解法中b’怎么求_14.初中数学:二元一次方程组,加减消元法怎么解?视频有详细解题步骤...
  9. 逆向查找_「函数说12」数据逆向查找很复杂?match+index让你轻松搞定
  10. matlab窗函数 响应,matlab窗函数设计方案.doc
  11. python设计模式1-单例模式
  12. 报表中判断字段中是否包含某字符串
  13. 基于微信小程序的学习网站源码
  14. 计算机黑屏但是有鼠标,电脑黑屏有鼠标箭头怎么办
  15. python数据分析教程百度云资源-【python数据分析+pdf】百度云下载 - 云盘精灵
  16. ceph L版本相对于J版本在scrub机制上做的优化
  17. 元旦贺卡 html5,元旦贺卡:最牛的元旦祝福语短信
  18. 2022年QIMA LVMH Ethical Audit Preparation Document
  19. java pdf 页眉_itext生成PDF设置页眉页脚的实例详解
  20. Hive SQL练习之影评案例

热门文章

  1. RaspberryPi 4B 使用超声波传感器 HC-SR04 进行距离检测
  2. 内部存储空间不足_手机存储空间不足应该如何解决
  3. mysql横纵表转换_MySQL横纵表相互转化操作实现方法
  4. 拉丝机是什么,它有什么作用?
  5. 小米mix Android9,小米mix3的系统是安卓9吗?
  6. 小卖家利好:淘宝C店将不显示差评
  7. pytorch 查找指定元素的索引
  8. appium连接模拟器后之图像是倒过来的
  9. 华为荣耀8电信卡显示无服务器,华为荣耀8青春版
  10. 【必读】关于赞赏的说明