AndroidRetrofit框架的使⽤
⽬录
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地址:
implementation 'fit2:retrofit:2.9.0'
//⽀持Gson解析json数据
implementation 'fit2:converter-gson:2.9.0'
//⽀持RxJava返回类型
implementation "fit2:adapter-rxjava2:2.9.0"
implementation "java2:rxandroid:2.0.2"
//⽀持协程,Retrofit2.6.0及以上版本不需要引⼊,Retrofit内置已经⽀持
//implementation 'fit: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 = "www.baidu"
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数据解析
.ate())
//⽀持RxJava返回类型
.ate())
.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() {
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_l⽂件
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<base-config cleartextTrafficPermitted="true" />
</network-security-config>
4.定义ApiService
⾸先我们先⽤⼀个最简单的GET请求来试⼀下,这个接⼝是请求天⽓情况的,免费的
interface Api {
@GET("www.weather/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/", 然后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(){
.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) {
}
})
安卓intent用法}
override fun 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?) {
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 {
}
}
}
在Activity中
1.创建ViewModel对象
2.注册LiveData的回调
3.获取天⽓情况
如下图所⽰
github地址:
以上就是Android Retrofit框架的使⽤的详细内容,更多关于Android Retrofit框架的资料请关注其它相关⽂章!

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。