Android retrofit+rxjava+okhttp封装使用

现在android网络请求大部分已经换成了Retrofit2.0+RxJava+okHttp3.0,Retrofit 使用接口的方式,负责请求的数据和请求的结果,OkHttp 负责请求的过程,RxJava 负责异步,各种线程之间的切换。毫无疑问这三剑客 已成为当前Android 网络请求最流行的方式。

简介

Retrofit: Retrofit是Square 公司开发的一款正对Android 网络请求的框架。底层基于OkHttp 实现,OkHttp 已经得到了google 官方的认可。Retrofit官网

OkHttp: 也是Square 开源的网络请求库

RxJava:RxJava 在 GitHub 主页上的自我介绍是 “a library for composing asynchronous and event-based programs using observable sequences for the Java VM”(一个在 Java VM 上使用可观测的序列来组成异步的、基于事件的程序的库)。这就是 RxJava ,概括得非常精准。总之就是让异步操作变得非常简单。

各自的职责

Retrofit 负责请求的数据和请求的结果,使用接口的方式呈现,OkHttp 负责请求的过程,RxJava 负责异步,各种线程之间的切换。

配合rxjava使用

1.要使用Retrofit ,你肯定需要把它的包引入,在你的build.gradle文件中添加如下配置:

implementation 'com.google.code.gson:gson:2.8.2'//gson解析
compile 'com.squareup.retrofit2:retrofit:2.0.2'//retrofit2.0
compile 'com.squareup.retrofit2:adapter-rxjava2:2.3.0'//配合Rxjava 使用
compile 'com.squareup.retrofit2:converter-gson:2.0.0-beta4'//ConverterFactory的Gson:
compile 'io.reactivex.rxjava2:rxjava:2.1.8'//rxjava
compile 'io.reactivex.rxjava2:rxandroid:2.0.1'
compile 'com.squareup.okhttp3:logging-interceptor:3.5.0'//日志拦截器

Retrofit官网上也有具体的用法的讲解,在这我就不献丑了!
Retrofit用法详解
2, 更改定义的接口,返回值不再是一个Call ,而是返回的一个Observble.

//请求接口根地址
public class Constant {
    public static String NewsUrl = "http://v.juhe.cn/";
    public static String AndroidNews = "http://gank.io/";
}
/**
 * Author:AND
 * Time:2018/2/27.
 * Email:[email protected]
 * Description:
 * Detail:
 */

public interface Request_Interface {
    @GET("toutiao/index?type=top&key=597b4f9dcb50e051fd725a9ec54d6653")
    Observable getNewsData();

    @GET("api/data/Android/10/{page}")
    Observable getAndroidNewsData(@Path("page") String page);
}

3,Activity 或者 Fragment 中传入 Subscriber 建立订阅关系

        //获取retrofit对象
        Request_Interface request_interface = RetrofitManager.getInstance(url).setCreate(Request_Interface.class);
        //封装请求方法
        Observable newsData = request_interface.getNewsData();
        //开始请求
        newsData.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() {
            @Override
            public void onSubscribe(Disposable d) {
            }

            @Override
            public void onNext(NewsBean newsBean) {
        //数据已经请求完毕
            }

            @Override
            public void onError(Throwable e) {
                Log.e(TAG, e.toString());
            }

            @Override
            public void onComplete() {
            }
        });

4,retrofit的封装

public class RetrofitManager {
    private Retrofit mRetrofit;
    private String baseUrl;
    private static RetrofitManager mRetrofitManager;
    public static OkHttpClient okHttpClient;

    //静态块,获取OkHttpClient对象
    static {
        getOkHttpClient();
    }

    private RetrofitManager(String baseUrl) {
        this.baseUrl = baseUrl;
        initRetrofit();
    }

    public static synchronized RetrofitManager getInstance(String baseUrl) {
        if (mRetrofitManager == null) {
            synchronized (RetrofitManager.class) {
                if (mRetrofitManager == null) {
                    mRetrofitManager = new RetrofitManager(baseUrl);
                }
            }
        }
        return mRetrofitManager;
    }

    //单例模式获取okhttp
    public static OkHttpClient getOkHttpClient() {
        if (okHttpClient == null) {
            synchronized (OkHttpClient.class) {
                if (okHttpClient == null) {
                    okHttpClient = new OkHttpClient.Builder()
                            //打印拦截器日志
                            .addNetworkInterceptor(new HttpLoggingInterceptor().setLevel(HttpLoggingInterceptor.Level.BODY))
                            .connectTimeout(15, TimeUnit.SECONDS)//设置连接超时时间
                            .readTimeout(15, TimeUnit.SECONDS)//设置读取超时时间
                            .writeTimeout(15, TimeUnit.SECONDS)//设置写入超时时间
                            .build();
                }
            }
        }
        return okHttpClient;
    }

    private void initRetrofit() {
        mRetrofit = new Retrofit.Builder()
                .baseUrl(baseUrl)
                .addConverterFactory(GsonConverterFactory.create())
                .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                .client(okHttpClient)
                .build();
    }

    /**
     * 创建相应的服务接口
     */
    public  T setCreate(Class reqServer) {
        return mRetrofit.create(reqServer);
    }
}

以上是加入RxJava 后的网络请求,返回不再是一个Call ,而是一个Observable, 在Activity / Fragment 中传入一个Subscriber 建立订阅关系,就可以在 onNext 中处理结果了,RxJava 的好处是帮我处理线程之间的切换,我们可以在指定订阅的在哪个线程,观察在哪个线程。我们可以通过操作符进行数据变换。整个过程都是链式的,简化逻辑。其中FlatMap 操作符 还可以解除多层嵌套的问题。总之,RxJava 很强大,能帮我处理很多复杂的场景,如果熟练使用的话,那么能提升我们的开发效率。

5,加入Okhttp的具体配置
通过OkHttpClient 可以配置很多东西,比如链接超时时间,缓存,拦截器等等。代码如下:

       // 创建 OKHttpClient
        OkHttpClient.Builder builder = new OkHttpClient.Builder();
        builder.connectTimeout(DEFAULT_TIME_OUT, TimeUnit.SECONDS);//连接超时时间
        builder.writeTimeout(DEFAULT_TIME_OUT, TimeUnit.SECONDS);//写操作 超时时间
        builder.readTimeout(DEFAULT_TIME_OUT, TimeUnit.SECONDS);//读操作超时时间
        // 添加公共参数拦截器
        BasicParamsInterceptor basicParamsInterceptor = new BasicParamsInterceptor.Builder()
                .addHeaderParam("userName", "")//添加公共参数
                .addHeaderParam("device", "")
                .build();
        builder.addInterceptor(basicParamsInterceptor);
        // 创建Retrofit
        mRetrofit = new Retrofit.Builder()
                .client(builder.build())
                .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
                .addConverterFactory(GsonConverterFactory.create())
                .baseUrl(ApiConfig.BASE_URL)
                .build();
连接超时时间,实际项目中,我们可能有一些公共的参数,如 ,设备信息,渠道,Token 之类的,每个接口都需要用,我们可以写一个拦截器,然后配置到OKHttpClient里,通过 builder.addInterceptor(basicParamsInterceptor) 添加,这样我们就不用每个接口都添加这些参数了。

Retrofit+Rxjava+OkHttp封装参考篇幅

你可能感兴趣的:(code小生)