Android Retrofit框架的使用
作者:浮沉一生 发布时间:2023-10-05 13:24:21
目录
Retrofit介绍
Retrofit优点
Retrofit的使用
1.引入依赖项
2.添加网络权限
3.编写Retrofit辅助类
4.定义ApiService
5.实现接口方法
Retrofit介绍
Retrofit是Square开源的一款基于OkHttp(也是他家的)封装的网络请求框架,主要的网络请求还是OkHttp来完成,Retrofit只是对OkHttp进行了封装,可以让我们更加简单方便的使用,目前大部分公司都在使用这款框架,Retrofit的原理也是面试必问的问题之一了,所以我们不仅要会使用,也要对其实现原理有一个大概的了解。
本片文章从使用角度来说,不对的地方希望大家在评论区交流,我会及时改进,共同进步,文章中的demo可以从github下载。
Retrofit优点
Retrofit的大部分配置是通过注解来实现的,配置简单,使用方便;支持多种返回类型包括RxJava和协程,可以配置不同的解析器来进行数据解析,如Json,xml等
Retrofit的使用
以下代码全部为Kotlin语言编写,毕竟现在Kotlin也是大势所趋了。
1.引入依赖项
github地址:github.com/square/retr…
implementation 'com.squareup.retrofit2:retrofit:2.9.0'
//支持Gson解析json数据
implementation 'com.squareup.retrofit2:converter-gson:2.9.0'
//支持RxJava返回类型
implementation "com.squareup.retrofit2:adapter-rxjava2:2.9.0"
implementation "io.reactivex.rxjava2:rxandroid:2.0.2"
//支持协程,Retrofit2.6.0及以上版本不需要引入,Retrofit内置已经支持
//implementation 'com.jakewharton.retrofit:retrofit2-kotlin-coroutines-adapter:0.9.2'
2.添加网络权限
<uses-permission android:name="android.permission.INTERNET"/>
3.编写Retrofit辅助类
首先定义一个RetrofitHelper辅助类,编写Retrofit单例,Retrofit内部已经维护了线程池做网络请求,不需要创建多个
注:BASE_URL必须为 "/" 结尾
object RetrofitHelper {
//baseUrl根据自己项目修改
private const val BASE_URL = "https://www.baidu.com"
private var retrofit: Retrofit? = null
private var retrofitBuilder: Retrofit.Builder? = null
//Retrofit初始化
fun init(){
if (retrofitBuilder == null) {
val client = OkHttpClient.Builder()
.connectTimeout(20, TimeUnit.SECONDS)
.readTimeout(20, TimeUnit.SECONDS)
.writeTimeout(20, TimeUnit.SECONDS)
.build()
retrofitBuilder = Retrofit.Builder()
.baseUrl(BASE_URL)
//支持Json数据解析
.addConverterFactory(GsonConverterFactory.create())
//支持RxJava返回类型
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.client(client)
}
retrofit = retrofitBuilder!!.build()
}
fun getRetrofit():Retrofit{
if (retrofit == null) {
throw IllegalAccessException("Retrofit is not initialized!")
}
return retrofit!!
}
}
然后再Application中进行初始化
class App:Application() {
override fun onCreate() {
super.onCreate()
RetrofitHelper.init()
}
}
在Manifest文件中指定Application
<application
android:name=".App"
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:networkSecurityConfig="@xml/network_security_config"
android:theme="@style/Theme.RetrofitDemo">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
Android P系统限制了明文流量的网络请求 解决的办法有2种 1.把所有的http请求全部改为https请求 2.在res的xml目录(),然后创建一个名为:network_security_config.xml文件
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<base-config cleartextTrafficPermitted="true" />
</network-security-config>
4.定义ApiService
首先我们先用一个最简单的GET请求来试一下,这个接口是请求天气情况的,免费的
interface Api {
@GET("http://www.weather.com.cn/data/sk/{cityCode}.html")
fun getWeather(@Path("cityCode")code:String):Observable<WeatherInfo>
}
定义返回类型,为了方便打印,用的data class 类型
data class WeatherInfo(
var weatherinfo:Info?=null) {
data class Info(
var city:String?,
var cityid:String?,
var temp:String?,
var WD:String?,
var WS:String?,
var SD:String?,
var AP:String?,
var njd:String?,
var WSE:String?,
var time:String?)
}
首先用@GET注解表示该借口为get请求,GET注解的value为请求地址,完整的请求地址为baseUrl+value,如value为完整地址,则会使用value为请求地址,一般通用情况下baseUrl = "www.weather.com.cn/", 然后GET("data/sk/{cityCode}.html") @Path是网址中的参数,用来替换。
5.实现接口方法
5.1RxJava方法实现
class RetrofitViewModel:ViewModel() {
private val disposables:CompositeDisposable by lazy {
CompositeDisposable()
}
fun addDisposable(d:Disposable){
disposables.add(d)
}
val weatherLiveData = MutableLiveData<WeatherInfo>()
fun getWeather(){
RetrofitHelper.getRetrofit().create(Api::class.java).getWeather("101010100")
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(object :Observer<WeatherInfo>{
override fun onComplete() {}
override fun onSubscribe(d: Disposable) {
addDisposable(d)
}
override fun onNext(t: WeatherInfo) {
weatherLiveData.value = t
}
override fun onError(e: Throwable) {
}
})
}
override fun onCleared() {
super.onCleared()
disposables.clear()
}
}
这里是用ViewModel中做的操作,如果是MVP模式放在Presenter中进行就好,首先通过Retrofit单例调用Service的对象的getWeather方法,指定上下游事件的线程,创建观察者对象进行监听,在onNext方法中拿到返回结果后回调给Activity,数据回调用的是LiveData,在Activity中操作如下
class MainActivity : AppCompatActivity() {
private val viewModel by viewModels<RetrofitViewModel>()
private var btnWeather: Button? = null
private var tvWeather: TextView? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
viewModel.weatherLiveData.observe(this, Observer {
tvWeather?.text = it.toString())
})
btnWeather = findViewById<Button>(R.id.btnWeather)
tvWeather = findViewById(R.id.tvWeather)
btnWeather?.setOnClickListener {
viewModel.getWeather()
}
}
}
在Activity中
1.创建ViewModel对象
2.注册LiveData的回调
3.获取天气情况
如下图所示
github地址:github.com/ZhiLiangT/R…
来源:https://juejin.cn/post/6943130952847589389


猜你喜欢
- 写这篇文章,做份备忘,简单滴展示一个带进度条的Webview示例,进度条位于Webview上面.示例图如下:主Activity代码:pack
- 前言在Android开发中我们可能会有延时执行某个操作的需求,例如我们启动应用的时候,一开始呈现的是一个引导页面,过了两三秒后,会自动跳转到
- 网络基础知识1、OSI分层模型和TCP/IP分层模型的对应关系这里对于7层模型不展开来讲,只选择跟这次系列主题相关的知识点介绍。2、七层模型
- java数据结构的堆什么是堆堆指的是使用数组保存完全二叉树结构,以层次遍历的方式放入数组中。如图:注意:堆方式适合于完全二叉树,对于非完全二
- 本文实例为大家分享了Java工具类DateUtils的具体代码,供大家参考,具体内容如下import java.text.ParseExce
- 一、问题分析入门案例的内容已经做完了,在入门案例中我们创建过一个SpringMvcConfig的配置类,再回想前面咱们学习Spring的时候
- 使用RNGCryptoServiceProvider类创建唯一的最多8位数字符串,再在前面拼接上年月日时分秒产生的字符串,最大限度的保证生成
- 前言:这个语句的作用是,确保该语句执行之后,关闭每一个资源,也就是说它确保了每个资源都在生命周期结束之后被关闭,因此,比如读写文
- Cocos2d-x从2.x版本到上周刚刚才发布的Cocos2d-x 3.0 Final版,其引擎驱动核心依旧是一个单线程的“死循环”,一旦某
- Spring Boot是什么众所周知 Spring 应用需要进行大量的配置,各种 XML 配置和注解配置让人眼花缭乱,且极容易出错,因此 S
- public static class EncryptAndDecrypt { &
- java Lock接口java.util.concurrent.locks接口Lockpublic interface Loce
- 先讲一下java中的反射:反射就是将类别的各个组成部分进行剖析,可以得到每个组成部分,就可以对每一部分进行操作反射机制应用场景:逆向代码、动
- 本文实例讲述了Android编程实现ListView滚动提示等待框功能。分享给大家供大家参考,具体如下:其实原理很简单,只需要设置监听lis
- 目录1.启动分为两种方式2.如何测量一个应用的启动时间3.应用启动的流程4.减少应用的启动时间的耗时5.如何设计延迟加载DelayLoad1
- 这几天一直都在捣鼓android的知识点,兴趣班的老师,讲课太过深奥,天(想到什么就见什么,后后面完全不想听),最后自己找资料总结了在And
- 效果图如下所示:代码:<LinearLayout android:orientation="horizontal
- 周末了,觉得我还有很多作业没有写,针对目前大家对OOM的类型不太熟悉,那么我们来总结一下各种OOM出现的情况以及解决方法。我们把各种OOM的
- SpringBoot @ConditionalOnBean实现原理在SpringBoot1.5.X时判断条件是OR,SpringBoot2.
- 前面我们讲到了Spring在进行事务逻辑织入的时候,无论是事务开始,提交或者回滚,都会触发相应的事务事件。本文首先会使用实例进行讲解Spri