封装Retrofit + okhttp + rxjava网络请求框架

前言

现在Android 市面上很火的当然是 Retrofit+RxJava + OkHttp, 功能强大,简单易用,因此选用这套方案来改造网络库。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 + Retrofit + okHttp 已成为当前Android 网络请求最流行的方式。

下面封装 一个 Retrofit + RxJava + OkHttp 的工具类 。

实现

第一步:在app下的builder.gradle中添加依赖库

    implementation 'com.squareup.retrofit2:retrofit:2.3.0'
    implementation 'com.squareup.retrofit2:converter-gson:2.3.0'
    implementation 'com.squareup.okhttp3:okhttp:3.9.0'
    implementation 'com.squareup.okhttp3:logging-interceptor:3.9.0'
    implementation 'io.reactivex:rxjava:1.3.0'
    implementation 'io.reactivex:rxandroid:1.2.1'
    implementation 'com.squareup.retrofit2:adapter-rxjava:2.3.0'

第二步:写接口,新建一个Interface 开始写接口

模拟一个登陆接口

public interface ApiInterface {
    @FormUrlEncoded
    @POST("api/login")
    Observable<Login> login(@Field("username") String username, @Field("password") String password);
}

重点来了: 开始封装网络请求框架


import android.util.Log;

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;

import java.io.IOException;
import java.util.concurrent.TimeUnit;

import okhttp3.Interceptor;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
import retrofit2.Retrofit;
import retrofit2.adapter.rxjava.RxJavaCallAdapterFactory;
import retrofit2.converter.gson.GsonConverterFactory;
import rx.Observable;
import rx.Subscriber;
import rx.android.schedulers.AndroidSchedulers;
import rx.schedulers.Schedulers;

/**
 * Created by 梁on 
 */

public class HttpClient {

    private  static HttpClient httpClient = null ;
    private final ApiInterface apiInterface;  //接口对象

//同步锁,单例模式,保证多线程访问的安全
    public static synchronized HttpClient getInstance(){
        if(httpClient == null)
        {
            httpClient = new HttpClient() ;
        }
        return httpClient ;
    }

    /*
    * 构造方法
    * */
    private HttpClient() {

        OkHttpClient okHttpClient = new OkHttpClient.Builder()
                .connectTimeout(8, TimeUnit.SECONDS) //连接超时时间
                .readTimeout(8,TimeUnit.SECONDS) //读取超时时间
                .writeTimeout(8,TimeUnit.SECONDS) //写超时时间
                .addInterceptor(new Interceptor() { //过滤器
                    @Override
                    public Response intercept(Chain chain) throws IOException {

                        Request original = chain.request();
                        Request request = original.newBuilder()
                                .addHeader("token", "token") //添加token
                                .method(original.method(), original.body())
                                .build();
                        return chain.proceed(request);
                    }
                })
                .build();

        Gson gson = new GsonBuilder().serializeNulls().setLenient().create();  //setLenient()严格按照日期的方式解析json


        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl("这里是你的url地址")
                .addConverterFactory(GsonConverterFactory.create(gson))   //配置转化库 默认是 json
                .client(okHttpClient)
                .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
                .build();
        apiInterface = retrofit.create(ApiInterface.class);//创建接口的实例

    }



    private void toSubscribe(Observable o, Subscriber s) {
        o.subscribeOn(Schedulers.io())
                .unsubscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(s);
    }
 /**
     * 登陆
     *
     * @param subscriber
     * @param username   用户名
     * @param password   密码
     */
    public void login(Subscriber<Login> subscriber ,String username, String paassword){
        Observable<Login> observable  = apiInterface.login(username,paassword);
        observable.subscribeOn(Schedulers.io())
                .unsubscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(subscriber);

    }

}

第三步:写实体类 Login,也就是要 写gson 解析json 的字段名,以下就不贴出来了

第四步 在activity中调用

HttpClient.getInstance().login(new Subscriber<Login>() {
   //请求成功
    @Override
    public void onCompleted() {
        Toast.makeText(MainActivity.this,"cehnggong",Toast.LENGTH_SHORT).show();
    }

//请求失败
    @Override
    public void onError(final Throwable e) {
       runOnUiThread(new Runnable() {
           @Override
           public void run() {
               Toast.makeText(MainActivity.this,e.getLocalizedMessage(),Toast.LENGTH_SHORT).show();
           }
       });
    }


    @Override
    public void onNext(Login login) {

//在此处理请求成功以后的逻辑      Toast.makeText(MainActivity.this,"onNext",Toast.LENGTH_SHORT).show();
    }
},"用户名","123456");

工具可以直接贴出来 直接使用。

猜你喜欢

转载自blog.csdn.net/baidu_38477614/article/details/78872150