欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android Retrofit框架的使用

程序员文章站 2022-07-06 09:22:20
retrofit介绍retrofit是square开源的一款基于okhttp(也是他家的)封装的网络请求框架,主要的网络请求还是okhttp来完成,retrofit只是对okhttp进行了封装,可以让...

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.获取天气情况

如下图所示

Android Retrofit框架的使用

github地址:github.com/zhiliangt/r…

以上就是android retrofit框架的使用的详细内容,更多关于android retrofit框架的资料请关注其它相关文章!