Kotlin结合Rxjava+Retrofit实现极简网络请求的方法

网友投稿 373 2023-03-17


Kotlin结合Rxjava+Retrofit实现极简网络请求的方法

前言

因为最近正在写的项目集成了两个网络请求框架(Volley and Retrofit)对比之下也是选择了Retrofit。既然选择那自然要让自己以后开发更加省力(就是懒)。于是我在Retrofit中加入了Rxjava,这也是当下蛮流行的一个请求框架。然后又利用了Kotlin的一些新特性,使网络请求变得特别简单,代码量特别少。

Kotlin镇楼

RxJava

RxJava学习是一个曲折漫长的过程,但一旦掌握,妙用无穷。

通过这里了解更多://jb51.net/article/126567.htm

Retrofit

导包:

compile 'com.squareup.retrofit2:retrofit:2.0.0-beta4'//Retrofit2所需要的包

compile 'com.squareup.retrofit2:converter-gson:2.0.0-beta4'//ConverterFactory的Gson依赖包

compile 'com.squareup.retrofit2:converter-scalars:2.0.0-beta4'//ConverterFactory的String依赖包

*这里需要值得注意的是:导入的retrofit2包的版本必须要一致,否则就会报错。

通过这里了解更多://jb51.net/article/120509.htm

正文

导包

首先需要导入相关的包,包括Rxjava(我这里使用的是1.x的版本,如果你使用的是2.x的版本影响不大)、Retrofit。

//Rxjava

compile 'io.reactivex:rxandroid:1.2.0'

compile 'io.reactivex:rxjava:1.2.0'

//Retrofit

compile 'com.squareup.retrofit2:retrofit:2.3.0'

compile 'com.squareup.retrofit2:converter-gson:2.3.0'

compile 'com.squareup.retrofit2:adapter-rxjava:2.3.0'

compile 'com.squareup.okhttp3:logging-interceptor:3.8.0'

初始化Retrofit

retrofit = Retrofit.Builder()

.client(build.build())

.baseUrl("你的url")

.addConverterFactory(GsonConverterFactory.create(gson))

.addCallAdapterFactory(RxJavaCallAdapterFactory.create())

.build().create(RetrofitUrl::class.java)

client传入的是一个OkhttpClient,这里我们需要创建一个OkhttpClient对象,这个可以用来加入一些拦截器、连接等待时间等,以下是我的client:

val build = OkHttpClient.Builder().connectTimeout(15,TimeUnit.SECONDS)

.writeTimeout(15,TimeUnit.SECONDS)

.readTimeout(15,TimeUnit.SECONDS)

val logging = HttpLoggingInterceptor(HttpLoggingInterceptor.Logger {

Log.e("retrofit url",it)

})

logging.level = HttpLoggingInterceptor.Level.BODY

我这里只设置了连接、读、写超时时间和一个拦截器,用于在用Retrofit请求网络的时候可以获取到请求的信息。然后是baseUrl这里是设置网络请求的通用的地址,格式类似于http://ip:端口/后台项目名/,需要以/结尾。而后的addConverterFactory和addCallAdapterFactory是我们刚刚导入的包,用于添加gson和RxJava支持,其中如果解析的时候有要求时间格式,可自定义一个gson传入:

val gson = GsonBuilder().setDateFormat("yyyy-MM-dd hh:mm:ss").create()

如果不要求时间格式,GsonConverterFactory.create(此处可以不传参数)。然后就是RetrofitUrl,这是一个接口,名字可以根据个人喜好进行定义,其内放置请求的接口:

interface RetrofitUrl {

//方法名自定义

@GET("接口地址")

fun load():Observable<对应实体类>

@FormUrlEncoded

@Post("接口地址")

fun load():Observable<对应实体类>

//需要传递参数,多个参数逗号隔开

@GET("接口地址")

fun load(@QueryvvXYqMndGK("参数名字") 参数名字(可自定义):参数类型):Observable<对应实体类>

@FormUrlEncoded

@Post("接口地址")

fun load(@Field("参数名字") 参数名字(可自定义):参数类型):Observable<对应实体类>

//示例

@GET("load")

fun load():Observable>

@GET("load")

fun load(@Query("id") id:Int):Observable>

}

以上就是初始化大概过程,初始化我是放在了自定义的Application中完成,使用时通过Application获取到Retrofit。

请求网络

以上都做完了就可以开始请求网络了。

通过Application获取到Retrofit后,我们就可以通过它去调用我们刚刚在接口中定义的方法,因为配置了RxJava,所以调用方法后会返回一个Observable,这也是我们在接口中定义的返回类型,如果没有添加RxJava,返回类型为Call。这样子我们就可以按照RxJava的习惯去写了:

retrofit().load()

.subscribeOn(Schedulers.io())

.observeOn(AndroidSchedulers.mainThread())

.subshttp://cribe(object :Subscriber>(){

override fun onCompleted() {

}

override fun onNext(t: NetOuter?) {

//可以在这里对获取到的数据进行处理

}

override fun onError(e: Throwable?) {

//请求失败

}

)

虽然这样子可以进行网络请求,可如果每次请求都要去写线程调度又觉得太麻烦了,都是一样的代码。这时候我们就用到了Kotlin的一个特性,扩展函数。我们新建一个Kotlin File文件,在其中写入我们修改了的代码:

fun runRx(observable: Observable, subscriber: Subscriber): Subscription =

observable.subscribeOn(Schedulers.io())

.observeOn(AndroidSchedulers.mainThread())

.subscribe(subscriber)

让我们调调这个方法看看效果:

runRx(retrofit().load(),object : Subscriber>() {

override fun onCompleted() {}

override fun onNext(t: NetOuter?) {

//可以在这里对获取到的数据进行处理

}

override fun onError(e: Throwable?) {

//请求失败

}

)

通过这一层的封装,省去了线程调度的代码,在大量请求的时候,可以省去不少代码。但是,就这个程度,还是觉得要一直写object : Subscriber...,这个也不想写,懒嘛。怎么办?只能继续封装,这时候就想到了Kotlin的另一个特性,高阶函数。Kotlin允许把一个方法当做一个参数进行使用,使用时通过Lambda的方式展示,一样在我们刚刚写runRx那个文件:

fun runRxLambda(observable: Observable,next:(T)->Unit,error:(e: Throwable?)->Unit,completed:() -> Unit = { Log.e("completed","completed") }){

runRx(observable, object : Subscriber() {

override fun onCompleted() { completed }

override fun onNext(t: T) { next(t) }

override fun onError(e: Throwable?) { error(e) }

})

}

runRxLambda(retrofit().load(),{

//我们在这里的操作就相当于在onNext中的操作,参数可以通过it获取

},{

//这里就是onError的实现,参数也可以通过it获取

})

runRxLambda(retrofit().load(),{

//我们在这里的操作就相当于在onNext中的操作,参数可以通过it获取

},{

//这里就是onError的实现,参数也可以通过it获取

},{

//这里是onCompleted,不实现也可以

})

总结

以上就是这篇文章的全部内容了,这里的一些实现方式不止用在这里,这篇文章也只是当做一个抛砖引玉,其中可能也有很多操作不到位,讲的不到位的,希望喷的小声点,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对我们的支持。


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Java多线程Queue、BlockingQueue和使用BlockingQueue实现生产消费者模型方法解析
下一篇:接口管理与测试平台(接口测试实操)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~