Kotlin in Android入门实践
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入门实践相关推荐
- kotlin开发Android入门篇八Kotlin开发Android的基本使用
基础篇:Kotlin开发Android的基本使用 使用AndroidStudio3.0及以上开发Kotlin在新建项目中勾选这个选项则会默认开发语言为Koltin,然后再gradle(Project的 ...
- kotlin开发Android入门篇一
基础篇:基本类型及方法的定义 kotlin介绍:Kotlin是一个基于JVM 的新的编程语言,由JetBrains 开发. Kotlin可以编译成Java字节码,也可以编译成JavaScript,方便 ...
- android hook底层代码_Java-Hook技术-入门实践(反射、动态代理)-Hook拦截通知(当前App/Context)...
老样子,上一篇MonkeyLei:Java-Hook技术-入门实践+反射.动态代理.热修复再看看 我们Hook学习了一下,一个是Java本地Main的实践练习. 一个是Android的监听事件的Hoo ...
- Android: Kotlin 材料设计入门
原文:Android: Kotlin 材料设计入门 作者:Joe Howard 译者:kmyhy 更新说明:本教程由 Joe Howard 升级为 Kotlin.原教程作者是 Megha Bambra ...
- android ndk 界面开发教程,AndroidStudio NDK开发最佳入门实践
AndroidStudio NDK开发最佳入门实践 网上一些介绍AndroidStudio NDK入门的教程,感觉都不是很完整和全面,也没有告诉初学AndroidStudio NDK的同学们一些需要注 ...
- 最强Android入门开发指南,帮你打通Android的任督二脉
Android 新手想要入门,很容易会遇到各类困难和学习瓶颈.没有一个好学的学习方向,学习规划,学习教程,这都是新手会面临的问题. 很多人会在百度上搜索,查阅相关资料.但是网上搜索的很多资料,都是断片 ...
- 如果你现在学Android---学习使用Kotlin进行Android开发
原文地址: http://www.eoeandroid.com/thread-902176-1-1.html?_dsign=650ea146 之前写了一篇<如果你现在学Android–写给新手的 ...
- Java vs Kotlin,Android开发人员应该选择哪种语言?
自 Google 于 2017 年宣布 Kotlin 成为 Google IO 的 Android 开发官方语言以来,想要成为Android开发人员的程序员正陷入两难境地. 在讨论这个问题前,我首先要 ...
- WEB入门实践-张晨光-专题视频课程
WEB入门实践-256人已学习 课程介绍 WEB开发入门编程,从各种开发工具的讲解到html标签,css元素讲解,js课程系列. 课程收益 培养web开发技术人才 讲师介绍 ...
最新文章
- 看动画轻松理解“递归”与“动态规划”
- c++服务器开发学习--02--MySQL,Redis,ASIO,iocp,TrinityCore代码结构,c++对象模型
- 学习asp.net ajax 笔记(一)
- linux消息队列的使用
- 操作软件_如何提升办公软件的操作能力
- Product ID Not in valid range
- lseek函数的使用
- pq分解法中b’怎么求_14.初中数学:二元一次方程组,加减消元法怎么解?视频有详细解题步骤...
- 逆向查找_「函数说12」数据逆向查找很复杂?match+index让你轻松搞定
- matlab窗函数 响应,matlab窗函数设计方案.doc
- python设计模式1-单例模式
- 报表中判断字段中是否包含某字符串
- 基于微信小程序的学习网站源码
- 计算机黑屏但是有鼠标,电脑黑屏有鼠标箭头怎么办
- python数据分析教程百度云资源-【python数据分析+pdf】百度云下载 - 云盘精灵
- ceph L版本相对于J版本在scrub机制上做的优化
- 元旦贺卡 html5,元旦贺卡:最牛的元旦祝福语短信
- 2022年QIMA LVMH Ethical Audit Preparation Document
- java pdf 页眉_itext生成PDF设置页眉页脚的实例详解
- Hive SQL练习之影评案例