Android Retrofit框架的使用
retrofit介绍
retrofit是square开源的一款基于okhttp(也是他家的)封装的网络请求框架,主要的网络请求还是okhttp来完成,retrofit只是对okhttp进行了封装,可以让我们更加简单方便的使用,目前大部分公司都在使用这款框架,retrofit的原理也是面试必问的问题之一了,所以我们不仅要会使用,也要对其实现原理有一个大概的了解。
本片文章从使用角度来说,不对的地方希望大家在评论区交流,我会及时改进,共同进步,文章中的demo可以从github下载。
retrofit优点
retrofit的大部分配置是通过注解来实现的,配置简单,使用方便;支持多种返回类型包括rxjava和协程,可以配置不同的解析器来进行数据解析,如json,xml等
retrofit的使用
以下代码全部为kotlin语言编写,毕竟现在kotlin也是大势所趋了。
1.引入依赖项
github地址:
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…
以上就是android retrofit框架的使用的详细内容,更多关于android retrofit框架的资料请关注其它相关文章!
推荐阅读
-
使用Kotlin开发Android应用的初体验
-
Python的Django框架中forms表单类的使用方法详解
-
使用Python的Bottle框架写一个简单的服务接口的示例
-
html5在android中的使用问题及技巧解读
-
Android Studio中使用lambda表达式的方法
-
Android 数据存储之 FileInputStream 工具类及FileInputStream类的使用
-
Android 自动判断是电话,网址,EMAIL方法之Linkify的使用
-
Android系统开发中log的使用方法及简单的原理
-
基于Android LayoutInflater的使用介绍
-
Android Spinner 下拉菜单的使用