Android 网络框架:Retrofit2一篇就够了(2020-4-23)
前言
目前Retrofit2、RxJava2、OkHttp3可以说非常火,经常被一并提及,因此学习它们是非常有必要的。
本系列主要写Retrofit2的使用,Retrofit2其实并不复杂,使用它只是为了规范我们网络请求的代码,深入学习之后会发现Retrofit2可以让代码可读性更好。
Retrofit的特点就是使用注解来描述一个http请求,本系列会在下一章具体讲解每一个注解的使用。
retrofit官网地址:https://square.github.io/retrofit/
1 入门
GRADLE
implementation 'com.squareup.retrofit2:retrofit:2.4.0'
也可以在官网下载JAR包,GitHub上可以查看源代码和示例。
①创建实体类接收Json。
data class WordData constructor(var reason:String,var result:Any,var error_code:String)
②将HTTP API转换成接口,如下所示:
interface WordService{
@GET("query")
fun getWord(@Query("word") word: String, @Query("dtype") dtype: String,@Query("key") key: String): Call<WordData>
}
③生成Retrofit实现接口实例。
var retrofit = Retrofit.Builder()
.baseUrl("http://v.juhe.cn/xhzd/")
.addConverterFactory(GsonConverterFactory.create())
.build()
var wordService = retrofit.create(WordService::class.java)
④调用接口的方法去异步请求网络,并通过callback回调请求结果。
(示例使用的是聚合数据的免费接口,key是错误的,正确key的Json太长....)
wordService.getWord("你","json","c5c6a09be5cdb2047")
.enqueue(object : Callback<WordData> {
override fun onFailure(call: Call<WordData>, t: Throwable) {
Log.d(tag,"onFailure")
}
override fun onResponse(call: Call<WordData>, response: Response<WordData>) {
Log.d(tag,response.body().toString())
}
})
请求回来的数据如下所示:
WordData(reason=错误的请求KEY, result=null, error_code=10001)
至此,已经使用Retrofit完成一个网络请求。
你也可以通过call调用同步网络请求代码如下所示:
var wordService = wordService.getWord("你","json","c5c6a09be5cdb2047")
var wordData = wordService.execute().body() as WordData
2 Converters
retrofit可以配置不同的工具来解析数据,例如gson、xml等等。
- Gson:
com.squareup.retrofit2:converter-gson
- Simple XML:
com.squareup.retrofit2:converter-simplexml
示例代码如下所示:
var retrofit = Retrofit.Builder()
.baseUrl("http://v.juhe.cn/xhzd/")
.addConverterFactory(GsonConverterFactory.create())
.build()
通过调用addConverterFactory()方法,添加GsonConverterFactory。
3 OkHttpClient
Retrofit也可以自定义OkHttpClient,代码如下所示:
val dispatcher = Dispatcher(Executors.newFixedThreadPool(20))
dispatcher.setMaxRequests(20)
dispatcher.setMaxRequestsPerHost(1)
val okHttpClient = OkHttpClient.Builder()
.dispatcher(dispatcher)
.connectionPool(ConnectionPool(100, 30, TimeUnit.SECONDS))
.build()
var retrofit = Retrofit.Builder()
.baseUrl("http://v.juhe.cn/xhzd/")
.addConverterFactory(GsonConverterFactory.create())
.client(okHttpClient)
.build()
4 Retrofit2 + RxJava2
在Retrofit中使用RxJava2,接口的定义和网络请求和上面略有不同,而且需要调用addCallAdapterFactory添加对RxJava2的支持。
Retrofit2
implementation 'com.squareup.retrofit2:retrofit:2.4.0'
implementation 'com.squareup.retrofit2:converter-gson:2.4.0'
implementation 'com.squareup.retrofit2:adapter-rxjava2:2.4.0'
Rxjava2
implementation 'io.reactivex.rxjava2:rxjava:2.2.3'
implementation 'io.reactivex.rxjava2:rxandroid:2.1.0'
①将HTTP API转换成接口,但是返回参数需要改变成Observable<WordData>,如下所示:
interface WordService {
@GET("/xhzd/query")
fun getWord(@Query("word") word: String, @Query("dtype") dtype: String,@Query("key") key: String): Observable<WordData>
}
②调用addCallAdapterFactory方法传入RxJava2CallAdapterFactory.create()生成Retrofit,然后实现接口实例。
var retrofit = Retrofit.Builder()
.baseUrl("http://v.juhe.cn")
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.client(okHttpClient)
.build()
var wordService = retrofit.create(WordService::class.java)
③使用RxJava2对数据进行处理,代码如下所示:
wordService.getWord("你", "json", "c5c6a09be5cdb2047")
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe({
Log.d(tag, it.toString())
}, {
Log.d(tag, "onFailure")
})
可以看见日志输入如下所示:
WordData(reason=错误的请求KEY, result=null, error_code=10001)
5 高级写法
①首先使用Body定义Api
interface IApi {
@POST("/xhzd/getUnreadRemind")
fun getMessageRemind(@Body params: JsonObject?): Observable<BaseBean<RedPointBean>>
}
②然后可以使用JsonObject定义一个基础请求体,封装一些我们每次请求都会带的参数。
object BaseRequestParams {
fun basePostParams(): JsonObject {
val baseParams = JsonObject()
baseParams.addProperty("device_id", DeviceUtil.getDeviceIMEI(getApplication()))
baseParams.addProperty("platform", "android")
return baseParams
}
}
③最后进行请求
var mService = retrofit.create(IApi::class.java)
override fun getSearchRecommendWord(keyword: String): Observable<BaseBean<RecommendWordBean>> {
val params = BaseRequestParams.basePostParams()
params.addProperty("keyword", keyword)
return mService.getMessageRemind(params)
}
总结
Retrofit使用非常简单,首先转换接口,然后创建Retrofit实例,再实现接口,最后进行网络请求,回调处理数据。
转载自:https://www.jianshu.com/p/9eeae877ddb0?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation
相关文章
- android-配置文件AndroidManifest.xml
- Android Fragment 你应该知道的一切
- Android 开源项目推荐之“网络请求哪家强”
- Android程序检测网络是否可用
- 【Android开源框架整合】Android热修复/插件化框架/组件化框架/图片加载框架/网络访问框架/RxJava响应式编程框架/IOC依赖注入框架/Jetpack架构
- android内存管理,Kotlin可能带来的一个深坑,年薪50W
- android studio 使用入门 (快捷键等收集)
- 使用Android网络编程实现简易聊天室
- Android防止内存溢出浅析
- 使用Iperf工具测试android系统网络wifi的吞吐量wifithrougput
- 深入理解 Android 之 View 的绘制流程
- Android判断网络是否打开,并打开设置网络界面
- Android 从网络中获取数据时 产生部分数据乱码的解决
- Android jetpack room+ViewModel+liveData 数据自动更新
- android开发工具类之获得WIFI IP地址或者手机网络IP
- Android 学习笔记(11)—— ListView 实现活动跳转
- Android 判断当前网络 wifi ctwap(cmwap) ctnet(cmnet)
- android判断连接的wifi是否能访问网络
- ReactNative调用Android原生模块
- Fiddler抓取Android手机网络数据包
- Android系统移植与调试之------->如何修改Android设备的开机第一阶段Logo