Android Retrofit框架的使用

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…

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

(0)

相关推荐

  • Android 封装Okhttp+Retrofit+RxJava,外加拦截器实例

    1.创建一个接口,用来定义接口使用的 public interface Api { @POST("product/getProductDetail") Observable<Goods_Bean> getGoods(@QueryMap Map<String,String> map); @POST("product/addCart") Observable<Add_Bean> getAdd(@QueryMap Map<Stri

  • Android Retrofit2数据解析代码解析

    在弄数据解析这块,浪费了很长的时间,最开始一直觉得传过来用对象接收的,类型是json,往那个方式去想了.搞了很久. 后来看了别人写的才发觉,真是很简单,感谢 https://www.jianshu.com/p/d0081e8a7edc 给我启发. 加入的jar包 // Retrofit库 implementation 'com.squareup.retrofit2:retrofit:2.0.2' implementation 'com.squareup.retrofit2:converter-g

  • 基于Retrofit2+RxJava2实现Android App自动更新

    本文实例为大家分享了Retrofit2 RxJava2实现Android App自动更新,具体内容如下 功能解析 自动更新可以说已经是App的标配了,很多第三方平台也都支持这个功能,最近手头上的项目需要加入这个App自动更新,考虑到项目里有用到Retrofit2和RxJava2,于是打算使用它俩自己实现这个功能. 分析App自动更新,可以分为以下三个功能点: 1.APK文件的下载 2.下载进度的实时更新显示 3.下载完成后的自动安装 其中比较难的一点是下载进度的实时更新显示,更难的是如何优雅的进

  • Android app开发中Retrofit框架的初步上手使用

    Retrofit 2.0 先来说一下Retrofit 2.0版本中一些引人注意的地方. 在Retrofit 2.0中,最大的改动莫过于减小库的体积,首先,Retrofit 2.0去掉了对所有的HTTP客户端的兼容,而钟情于OkHttpClient一个,极大地减少了各种适配代码,原因一会儿说;其次,拆库,比如将对RxJava的支持设置为可选(需要额外引入库):再比如将各个序列化反序列化转换器支持设置为可选(需要额外引入库).于2.0抛弃HttpClient和HttpURLConnection,为了

  • Android中Retrofit的简要介绍

    Retrofit A type-safe HTTP client for Android and Java 适用于Java和Android的安全的HTTP客户端 Retrofit是一个可用于Android和Java的网络库,使用它可以简化我们的网络操作,提高效率和正确率.它将请求过程和底层代码封装起来只暴露我们业务中的请求和返回数据模型. public interface GitHubService { @GET("users/{user}/repos") Call<List&l

  • Android使用 Retrofit 2.X 上传多文件和多表单示例

    retrofit post请求上传表单和文件最重要的就是就是去构建RequestBody,今天为大家带来一种超级简单的上传方式 Body方式: 1.Retrofit接口RetrofitInterface @POST(URLConstant.URL_PATH) Flowable<UploadImgBean> upload(@Body RequestBody Body); 2.Retrofit的配置 private static RetrofitInterface getRetrofitInter

  • 简略分析Android的Retrofit应用开发框架源码

    面对一个项目,对于Android应用开发框架的选择,我想过三种方案: 1.使用Loader + HttpClient + GreenDao + Gson + Fragment,优点是可定制性强,由于使用Google家自己的Loader和LoaderManager,代码健壮性强. 缺点是整套代码学习成本较高,使用过程中样板代码较多,(比如每一个Request都需要产生一个新类) 2.Volley,作为Google在IO大会上得瑟过的一个网络库,其实不算什么新东西(2013 IO发布),使用较为简单

  • Android retrofit上传文件实例(包含头像)

    上传文件主要就是通过接口 1.AndroidMainfest.xml中加入权限 <uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> <uses-permission android:name="android

  • Android Retrofit 2.0框架上传图片解决方案

    本文为大家分享了 Android Retrofit 2.0框架上传图片解决方案,具体内容如下 1.单张图片的上传 /** * 上传一张图片 * @param description * @param imgs * @return */ @Multipart @POST("/upload") Call<String> uploadImage(@Part("fileName") String description, @Part("file\&qu

  • Android网络请求框架Retrofit详解

    介绍: Retrofit 是Square公司开发的一款针对Android网络请求的框架,Retrofit2底层基于OkHttp实现的,OkHttp现在已经得到Google官方认可,大量的app都采用OkHttp做网络请求.本文使用Retrofit2.0.0版本进行实例演示. 使用Retrofit可以进行GET,POST,PUT,DELETE等请求方式. 同步请求:需要在子线程中完成,会阻塞主线程. Response response = call.execute().body(); 异步请求:请

  • Android Retrofit 中文乱码问题的解决办法

    Android Retrofit 中文乱码问题的解决办法 使用retrofit和rxjava,提交数据时需注意,当数据中有中文时,传到后台,可能会是乱码,需处理: 解决: 1.GET请求改成POST; 2.参数Field改成Query 3.加上@FormUrlEncoded 如下: @FormUrlEncoded @POST("/test/test") Call<Response> register(@Field("name") String name)

  • Retrofit和OkHttp如何实现Android网络缓存

    前提: 没做过网络缓存这方面的功能,所以想学习下.上网看了很多的文章,也看了部分视频.想把自己的一些小小的心德分享一下.如何能够稍微帮助到别人,那对我来说就算是有意义了.废话不多说了.进入正题. 1.网路请求 网络请求用的是Retrofit.用过的人,都知道优点.没用过的人就照着图示或者Demo去写就好了,而且网上的文章一大堆,本人就不赘述了. 网络请求的写法 2.添加缓存 重点来了,在网上看了许多的缓存方法.到最后还是选择了,OkHttp添加拦截器的这种方法.貌似用这种方法的人最多. 先来两张

  • Android中Retrofit 2.0直接使用JSON进行数据交互

    之前使用Retrofit都是将JSON串转化为POJO对象,针对不同的业务协议,定义相应的接口和参数列表.但是此种方式一般用在自己内部协议基础上,具体大的项目中,有些第三方的集成功能,一般都采用统一的方式即请求JSON和回应JSON进行数据交互,不可能每个第三方协议都会去定义与协议相应的POJO对象. HTTP肯定有GET和POST方法,先定义Retrofit Api的interface: package com.hdnetworklib.network.http; import java.ut

  • Android Retrofit2网路编程实现方法详解

    Android里面本身有OKHttp,不过不是很好用,这里就用Retrofit2,简单好用. 首先,需要加入网络权限: <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> <uses-permission andro

随机推荐