您现在的位置是:首页 > 数码 > 

Kotlin in Android入门实践

2025-07-27 02:26:25
Kotlin in Android入门实践 1、前言 虽然有了解kotlin,但是一直没在项目中使用,最近为了学习Jetpack组件化,新开了个练习项目,顺便学一下kotlin,记录下学习路线。 2、学习路线 2.1、语言学习 主要学一下基本语法: 官方中文文档:/ 2.

Kotlin in Android入门实践

1、前言

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

2、学习路线

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()}}	
}
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)
}

#感谢您对电脑配置推荐网 - 最新i3 i5 i7组装电脑配置单推荐报价格的认可,转载请说明来源于"电脑配置推荐网 - 最新i3 i5 i7组装电脑配置单推荐报价格

本文地址:http://www.dnpztj.cn/shuma/857322.html

相关标签:无
上传时间: 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