网站首页 > 开源技术 正文
1.1 Flow的用法
-
创建Flow :使用 flow 函数创建一个Flow,然后在Flow中使用 emit 函数发射数据。
val?numbersFlow?=?flow?{
????for?(i?in?1..3)?{
????????emit(i)
????}
}
-
收集Flow :使用 collect 函数收集Flow中的数据,并对数据进行处理。
GlobalScope.launch?{
????numbersFlow.collect?{?number?->
????????println(number)
????}
}
-
转换Flow :使用 map、filter 等转换操作符对Flow中的数据进行转换。
val?squaresFlow?=?numbersFlow.map?{?number?->
????number?*?number
}
-
组合Flow :使用 combine、zip 等组合操作符将多个Flow组合在一起。
val?anotherFlow?=?flow?{
????for?(i?in?4..6)?{
????????emit(i)
????}
}
val?combinedFlow?=?numbersFlow.combine(anotherFlow)?{?a,?b?->
????a?+?b
}
-
异常处理 :使用 catch、onCompletion 等操作符处理Flow中的异常。
val?errorFlow?=?flow?{
????for?(i?in?1..3)?{
????????if?(i?==?2)?{
????????????throw?RuntimeException("Error?on?$i")
????????}
????????emit(i)
????}
}.catch?{?e?->
????println("Caught?exception:?$e")
}
1.2 Flow的原理
-
Flow接口 :代表一个数据流,可以通过 collect 函数进行收集。 -
flow函数 :用于创建一个Flow,可以在其中使用emit函数发射数据。 -
collect函数 :用于收集Flow中的数据,并对数据进行处理。 -
转换操作符 :如map、filter等,用于对Flow中的数据进行转换。 -
组合操作符 :如combine、zip等,用于将多个Flow组合在一起。 -
异常处理操作符 :如catch、onCompletion等,用于处理Flow中的异常。
1.3 示例代码
import?kotlinx.coroutines.flow.*
import?kotlinx.coroutines.*
fun?main()?=?runBlocking?{
????//?创建Flow
????val?numbersFlow?=?flow?{
????????for?(i?in?1..5)?{
????????????delay(100)??//?模拟异步操作
????????????emit(i)
????????}
????}
????//?转换Flow
????val?squaresFlow?=?numbersFlow.map?{?number?->
????????number?*?number
????}
????//?收集Flow
????squaresFlow.collect?{?square?->
????????println("Square:?$square")
????}
????//?组合Flow
????val?anotherFlow?=?flow?{
????????for?(i?in?6..10)?{
????????????delay(100)
????????????emit(i)
????????}
????}
????val?combinedFlow?=?numbersFlow.combine(anotherFlow)?{?a,?b?->
????????a?+?b
????}
????combinedFlow.collect?{?sum?->
????????println("Sum:?$sum")
????}
????//?异常处理
????val?errorFlow?=?flow?{
????????for?(i?in?1..3)?{
????????????if?(i?==?2)?{
????????????????throw?RuntimeException("Error?on?$i")
????????????}
????????????emit(i)
????????}
????}.catch?{?e?->
????????println("Caught?exception:?$e")
????}
????errorFlow.collect?{?number?->
????????println("Number:?$number")
????}
}
通过这个示例,我们可以看到Flow提供了一种简洁、优雅的方式来处理异步、时间相关的操作。我们可以使用Flow的各种操作符对数据流进行转换、组合和异常处理,从而更好地组织和管理我们的代码。
2.1 Retrofit的用法
-
创建Retrofit实例 :使用 Retrofit.Builder 创建一个Retrofit实例,并配置HTTP客户端(如OkHttp)、基本URL和转换器等。
val?retrofit?=?Retrofit.Builder()
????.baseUrl("https://api.example.com/")
????.client(OkHttpClient())
????.addConverterFactory(GsonConverterFactory.create())
????.build()
-
定义API接口 :创建一个Kotlin接口,并使用注解描述API的请求方式、路径、参数等信息。
interface?ApiService?{
????@GET("user/{id}")
????suspend?fun?getUser(@Path("id")?id:?Int):?User
}
-
创建API接口实例 :使用Retrofit实例的 create 方法创建API接口的实例。
val?apiService?=?retrofit.create(ApiService::class.java)
-
调用API接口 :直接调用API接口的方法发起网络请求。
GlobalScope.launch?{
????val?user?=?apiService.getUser(1)
????println("User:?$user")
}
2.2 Retrofit的原理
-
Retrofit类 :用于创建和配置Retrofit实例,以及创建API接口的实例。 -
注解 :如 @GET、@POST、@Path 等,用于描述API的请求方式、路径、参数等信息。 -
转换器 :如 GsonConverterFactory、MoshiConverterFactory 等,用于将HTTP响应转换为Kotlin或Java对象,以及将对象转换为请求体。 -
HTTP客户端 :如OkHttpClient,用于实际发起网络请求。Retrofit内部使用HTTP客户端来处理网络请求和响应。
-
使用 Retrofit.Builder 创建一个Retrofit实例,并配置HTTP客户端、基本URL和转换器等。 -
使用注解定义API接口,并描述API的请求方式、路径、参数等信息。 -
使用Retrofit实例的 create 方法创建API接口的实例。Retrofit会使用动态代理创建一个实现了API接口的对象。 -
调用API接口的方法发起网络请求。Retrofit会根据方法的注解信息构建HTTP请求,并使用HTTP客户端发起请求。然后,Retrofit会使用转换器将HTTP响应转换为Kotlin或Java对象,并返回给调用者。
2.3 示例代码
import?retrofit2.Retrofit
import?retrofit2.converter.gson.GsonConverterFactory
import?retrofit2.http.GET
import?retrofit2.http.Path
import?kotlinx.coroutines.runBlocking
import?okhttp3.OkHttpClient
data?class?User(val?id:?Int,?val?name:?String)
interface?ApiService?{
????@GET("user/{id}")
????suspend?fun?getUser(@Path("id")?id:?Int):?User
}
fun?main()?=?runBlocking?{
????val?retrofit?=?Retrofit.Builder()
????????.baseUrl("https://api.example.com/")
????????.client(OkHttpClient())
????????.addConverterFactory(GsonConverterFactory.create())
????????.build()
????val?apiService?=?retrofit.create(ApiService::class.java)
????val?user?=?apiService.getUser(1)
????println("User:?$user")
}
这个示例展示了如何使用Retrofit优雅地实现网络请求。
val?okHttpClient?=?OkHttpClient.Builder()
????.connectTimeout(15,?TimeUnit.SECONDS)
????.readTimeout(15,?TimeUnit.SECONDS)
????.writeTimeout(15,?TimeUnit.SECONDS)
????.build()
val?retrofit?=?Retrofit.Builder()
????.baseUrl("https://api.example.com/")
????.client(okHttpClient)
????.addConverterFactory(GsonConverterFactory.create())
????.addCallAdapterFactory(CoroutineCallAdapterFactory())
????.build()
interface?ApiService?{
????@GET("user/{id}")
????suspend?fun?getUser(@Path("id")?id:?Int):?User
}
fun?getUser(id:?Int):?Flow<User>?=?flow?{
????val?apiService?=?retrofit.create(ApiService::class.java)
????val?user?=?apiService.getUser(id)
????emit(user)
}.catch?{?e?->
????//?处理异常
}
viewModelScope.launch?{
????getUser(1).collect?{?user?->
????????//?处理数据
????}
}
在这个代码中,我们使用 viewModelScope.launch 来启动一个协程,并在协程中收集Flow。我们可以在 collect 函数中处理数据。
猜你喜欢
- 2024-09-28 我放弃了okhttp、httpClient,选了这个神仙工具
- 2024-09-28 很懵圈,记录一次MinIO 使用okhttp版本的问题?
- 2024-09-28 android学习,OkHttp,拦截器(okhttp自定义拦截器放在哪一层)
- 2024-09-28 Okhttp上传图片失败,居然是服务端的锅?(一)
- 2024-09-28 工作日报 2021.10.20 OkHttp3错误异常:unexpected end of stream
- 2024-09-28 深入浅出 OkHttp 源码解析及应用实践
- 2024-09-28 用OkHttp实现WebSocket长连接(利用输入实现预期结果的相互关联或者相作用的一组活动 描述的是)
- 2024-09-28 干货-okHttp的优点-收藏了(水瓶座女的缺点和优点)
- 2024-09-28 软件更新丨OkHttp 4.0.0 RC 3 发布,从 Java 切换到 Kotlin
- 2024-09-28 开发者必备的Android开发资源之OkHttp
你 发表评论:
欢迎- 03-19基于layui+springcloud的企业级微服务框架
- 03-19开箱即用的前端开发模板,扩展Layui原生UI样式,集成第三方组件
- 03-19SpringMVC +Spring +Mybatis + Layui通用后台管理系统OneManageV2.1
- 03-19SpringBoot+LayUI后台管理系统开发脚手架
- 03-19layui下拉菜单form.render局部刷新方法亲测有效
- 03-19Layui 遇到的坑(记录贴)(layui chm)
- 03-19基于ASP.NET MVC + Layui的通用后台开发框架
- 03-19LayUi自定义模块的定义与使用(layui自定义表格)
- 最近发表
-
- 基于layui+springcloud的企业级微服务框架
- 开箱即用的前端开发模板,扩展Layui原生UI样式,集成第三方组件
- SpringMVC +Spring +Mybatis + Layui通用后台管理系统OneManageV2.1
- SpringBoot+LayUI后台管理系统开发脚手架
- layui下拉菜单form.render局部刷新方法亲测有效
- Layui 遇到的坑(记录贴)(layui chm)
- 基于ASP.NET MVC + Layui的通用后台开发框架
- LayUi自定义模块的定义与使用(layui自定义表格)
- Layui 2.9.11正式发布(layui2.6)
- Layui 2.9.13正式发布(layui2.6)
- 标签列表
-
- jdk (81)
- putty (66)
- rufus (78)
- 内网穿透 (89)
- okhttp (70)
- powertoys (74)
- windowsterminal (81)
- netcat (65)
- ghostscript (65)
- veracrypt (65)
- asp.netcore (70)
- wrk (67)
- aspose.words (80)
- itk (80)
- ajaxfileupload.js (66)
- sqlhelper (67)
- express.js (67)
- phpmailer (67)
- xjar (70)
- redisclient (78)
- wakeonlan (66)
- tinygo (85)
- startbbs (72)
- webftp (82)
- vsvim (79)
本文暂时没有评论,来添加一个吧(●'◡'●)