Kotlin in Android入门实践
Kotlin in Android入门实践
1、前言
虽然有了解kotlin,但是一直没在项目中使用,最近为了学习Jetpack组件化,新开了个练习项目,顺便学一下kotlin,记录下学习路线。
2、学习路线
2.1、语言学习
主要学一下基本语法:
官方中文文档:/
2.
Kotlin in Android入门实践
虽然有了解kotlin,但是一直没在项目中使用,最近为了学习Jetpack组件化,新开了个练习项目,顺便学一下kotlin,记录下学习路线。
2.1、语言学习
主要学一下基本语法:
官方中文文档:/
2.2、Android中的学习
kotlin在android中的使用:
google官方文档:
看完差不多够用了
2.、协程
协程可以用同步的方式编写异步的代码(减少回调),在Android中如网络请求,文件io,数据库等。协程比线程更轻量,线程是全局的,但是协程可以指定作用域,在Android中利用viewModelScope或者lifecycleScope可以感知activity生命周期,并自动取消协程。
viewModelScope.launch{//主线程启动一个协程val data = repository.fetchData() //网络请求//更新 =
}
更多可以参考google开源项目:sunflower
2.4、扩展函数
kotlin提供了很多扩展函数,比如apply、run等,也可以自定义,如
/*** 图片加载扩展方法*/
fun ImageView.load(url: String) {Glide.with(this).load(url).into(this)
}imageView.load()
/*** 根据手机的分辨率将dp转成为px。*/
val Float.dxget() = TypedValue.applyDimension(TypedValue.COMPLEX_UIT_DIP,this,Resources.getSystem().displayMetrics)
//使用
20f.dx
.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<othing>()
}//请求数据
viewModelScope.launch{//主线程启动一个协程try{val data = repository.fetchData() //网络请求//更新 = data.} catch(e : Exception){//请求失败...}
}
.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发送数据= data.}is ApiResult.Error ->{ //错误提示print()}}
}
如果用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)
}
完
#感谢您对电脑配置推荐网 - 最新i3 i5 i7组装电脑配置单推荐报价格的认可,转载请说明来源于"电脑配置推荐网 - 最新i3 i5 i7组装电脑配置单推荐报价格
上传时间: 2024-02-10 12:02:58
推荐阅读
留言与评论(共有 18 条评论) |
本站网友 营销之父 | 22分钟前 发表 |
T) | |
本站网友 注资 | 18分钟前 发表 |
前言 虽然有了解kotlin,但是一直没在项目中使用,最近为了学习Jetpack组件化,新开了个练习项目,顺便学一下kotlin,记录下学习路线 | |
本站网友 中国商业地产网 | 15分钟前 发表 |
ApiService执行网络请求*/ //retrofit网络请求接口 interface Api {/*** 获取数据*/@GETsuspend fun fetchData(@Url url | |
本站网友 保利小泉别墅 | 0秒前 发表 |
ApiResult<T> =try {//请求成功ApiResult.Success(call())} catch (e | |
本站网友 明智的 | 17分钟前 发表 |
Exception){//请求失败...} } .2 | |
本站网友 怎么卸载ie9 | 4分钟前 发表 |
Repository持有ApiService | |
本站网友 喉咙 | 28分钟前 发表 |
() -> Unit = {} | |
本站网友 闭经 | 24分钟前 发表 |
onStart = { // 请求开始_onRefreshing.value = true_onError.value = false} | |
本站网友 事后避孕药 | 12分钟前 发表 |
run等,也可以自定义,如 /*** 图片加载扩展方法*/ fun ImageView.load(url | |
本站网友 陶陶居茶楼 | 12分钟前 发表 |
suspend方法,返回数据类型为泛型T* [errorMsg]:错误信息* 返回类型:ApiResult<T> 可能为Success也可能为Error*/ suspend fun <T | |
本站网友 上海外墙清洗公司 | 15分钟前 发表 |
Exception) | |
本站网友 首乌丸 | 3分钟前 发表 |
suspend () -> T | |
本站网友 浏览器内核 | 14分钟前 发表 |
onError = { // 请求失败_onError.value = true}).launchIn(viewModelScope) } 完 | |
本站网友 镭射去痘印 | 5分钟前 发表 |
String = http | |
本站网友 烟台房产网 | 25分钟前 发表 |
T) | |
本站网友 铜钼 | 3分钟前 发表 |
Resources.getSystem().displayMetrics) //使用 20f.dx | |
本站网友 女生日常自慰道具 | 22分钟前 发表 |
String) {Glide.with(this).load(url).into(this) }imageView.load() /*** 根据手机的分辨率将dp转成为px |