网络请求Retrofit+RxJava直接撸代码

 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())
    }
  
}

猜你喜欢

转载自blog.csdn.net/krcm110/article/details/82950401