Retrofif+Rxjava实现网络数据交互。
Retrofit是什么?
Retrofit其实我们可以理解为OkHttp的加强版,它也是一个网络加载框架。底层是使用OKHttp封装的。准确来说,网络请求的工作本质上是OkHttp完成,而 Retrofit 仅负责网络请求接口的封装。它的一个特点是包含了特别多注解,方便简化你的代码量。并且还支持很多的开源库(著名例子:Retrofit + RxJava)。
还想说一点题外话,Retrofit和OkHttp都是square公司
为什么要用Retrofit?
https://www.jianshu.com/p/0fda3132cf98
看他的博客吧。我这里就直接上代码了。
1.新建RetrofitBase.kt
RetrofitBase
object RetrofitBase { private var client: OkHttpClient? = null private var retrofit:Retrofit? = null; private var baseUrl = "http://baobab.kaiyanapp.com/api/"; /** * 创建Retorfit类 */ fun getRetrofit():Retrofit { if (retrofit == null) { synchronized(RetrofitBase::class.java) { if(retrofit==null) { retrofit = Retrofit.Builder() .client(getOkhttp()) .baseUrl(baseUrl) .addCallAdapterFactory(RxJava2CallAdapterFactory.create())//添加RXjava适配器 .addConverterFactory(GsonConverterFactory.create())//添加Gson适配器 //.addConverterFactory(ProtoConverterFactory.create())//天剑GoogleProtolBuffer适配器 .build() } } } return retrofit!! } /** * 创建一个OkHttp */ private fun getOkhttp(): OkHttpClient { if(client==null) { synchronized(RetrofitBase::class.java) { if(client==null) { //创建缓存文件 val cacheFile = File(MyApplication.context.cacheDir, "cache") //设置缓存文件的大小 val cache = Cache(cacheFile, 1024 * 1024 * 50) //50Mb 缓存的大小 //构建一个Okhttp client = OkHttpClient.Builder() .connectTimeout(3, TimeUnit.SECONDS)//链接超时 .readTimeout(3, TimeUnit.SECONDS)//读取数据超时 .writeTimeout(3, TimeUnit.SECONDS)//写入数据超时 .retryOnConnectionFailure(true)//网络出现错误时重写链接 .cache(cache) //添加缓存文件 .addInterceptor(baseIntercepter())//添加网络请求拦截器 .addInterceptor(getHTPLogInterreptor()).//添加网络请求拦截器设置Log信息 build();//构建Okhttp } } } return client!!; } private fun getHTPLogInterreptor(): HttpLoggingInterceptor { //添加一个log拦截器,打印所有的log val logInterceptor = HttpLoggingInterceptor() //可以设置请求过滤的水平,body,basic,headers logInterceptor.level = HttpLoggingInterceptor.Level.BODY return logInterceptor }; /** * 添加公共参数也就是头信息 */ private fun baseIntercepter(): BasicParamsInterceptor { return BasicParamsInterceptor.Builder() .addHeaderParam("userName", "")//添加公共参数 .addHeaderParam("device", "") .build() }; }
2.新建接口层
IkaiYan.kt
interface IkaiYan { /** * 首页精选 */ @GET("ap1/v2/feed?") fun getFirstHomeData(@Query("num") num:Int): Observable<HomeBean> }
3.新建
ConnectService.as
object ConnectService { //使用RetrofitBase链接网络 val kaiyanService:IkaiYan by lazy { RetrofitBase.getRetrofit().create(IkaiYan::class.java) } }
4.应用层
class HomeModel { fun requestHomeData(num:Int): Observable<HomeBean> { return ConnectService.kaiyanService.getFirstHomeData(1).compose(SchedulerUtils.ioToMain()) } }