retrofit2 + rxjava2 简单封装使用

使用效果

 NetWork.getInstance().doLogin(userName, password, new NetBackListener<ResLogin>() {
                    @Override
                    public void onError(String msg) {
                   
                    }

                    @Override
                    public void onSuccess(ResLogin data) {
                    	jumpActivityAndFinish(MainActivity.class);
                    	
                    }

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

封装后代码结构清晰,日后更换网络框架只需要更改 NetWork 中的 代码。

导入框架

 	implementation 'com.squareup.okhttp3:logging-interceptor:3.12.2'
    implementation 'com.squareup.okhttp3:okhttp:3.12.2'
    implementation 'io.reactivex.rxjava2:rxjava:2.2.10'
    implementation 'io.reactivex.rxjava2:rxandroid:2.1.1'
    implementation 'com.squareup.retrofit2:retrofit:2.5.0'
    implementation 'com.squareup.retrofit2:converter-gson:2.5.0'
    implementation 'com.squareup.retrofit2:adapter-rxjava2:2.5.0'

封装 HttpClient

public class HttpClient {
 	//  接口根地址 你的地址
 	String BASE_URL =// 默认的超时时间
    public static final int DEFAULT_MILLISECONDS = 60000;
    //okhttp请求的客户端
    private OkHttpClient.Builder okHttpClientBuilder;
    //Retrofit请求Builder
    private Retrofit.Builder retrofitBuilder;

 	public HttpClient() {
		// onhttpclient
        okHttpClientBuilder = new OkHttpClient.Builder()
                .connectTimeout(DEFAULT_MILLISECONDS, TimeUnit.MILLISECONDS)
                .readTimeout(DEFAULT_MILLISECONDS, TimeUnit.MILLISECONDS)
                .writeTimeout(DEFAULT_MILLISECONDS, TimeUnit.MILLISECONDS)
                // 这里你可以根据自己的机型设置同时连接的个数和时间,我这里8个,和每个保持时间为10s
                .connectionPool(new ConnectionPool(8, 15, TimeUnit.SECONDS))
        ;

		//  添加 token 拦截器
        okHttpClientBuilder.addInterceptor(new TokenInterceptor());

		//  正式版本则不打印日志
        if (BuildConfig.DEBUG) {
            okHttpClientBuilder.addInterceptor(new HttpLoggingInterceptor(
                    new LogIntercepor()).setLevel(HttpLoggingInterceptor.Level.BODY));
        }

		// retrofit
        retrofitBuilder = new Retrofit.Builder()
                .client(okHttpClientBuilder.build())
                .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                .addConverterFactory(GsonConverterFactory.create())
                .baseUrl(Constant.BASE_URL)
        ;
    }

 	/**
     * 获取Retrofit
     *
     * @return Retrofit
     */
    public Retrofit getRetrofit() {
        return retrofitBuilder.build();
    }
}

日志、Token拦截器

public class TokenInterceptor implements Interceptor {
    @Override
    public Response intercept(Chain chain) throws IOException {
        Request request = chain.request();
        Request.Builder builder = request.newBuilder();
        //获取 你自己的token
        String token =if (!TextUtils.isEmpty(token)) {
            builder.header("token", token);
        }
        return chain.proceed(builder.build());
    }
 }  



public class LogIntercepor implements HttpLoggingInterceptor.Logger {

    @Override
    public void log(String message) {
//        try {
//            Log.d("--网络请求日志--", URLDecoder.decode(message, "utf-8"));
//        } catch (UnsupportedEncodingException e) {
//            e.printStackTrace();
//            Log.d("--网络请求日志--", message);
//
//        }

		// 日志
        Log.d("--网络请求日志--", message);
    }

定义接口 NetBackListener

public interface NetBackListener<T> {

    /**
     * 错误回调
     * @param msg 消息
     */
    void onError(String msg);

    /**
     * 成功回调
     * @param data 数据
     */
    void onSuccess(T data);

    /**
     * 成功,数据为空
     */
    void onEmpty();
}

构建 ApiService

interface ApiService {

    //登录

    @GET("你的 login 地址")
    Observable<ResBean<ResLogin>> doLogin(@Query("userName") String username,
                                          @Query("passWord") String password);

封装 NetWork

public class NetWork {
    private static NetWork netWork;
    private static ApiService apiService;
    private static final int SUCCESS_CODE = 200;

    public static NetWork getInstance() {
        if (netWork == null) {
            synchronized (NetWork.class) {
                if (netWork == null) {
                    netWork = new NetWork();
                    // 初始化 HttpClient
                    HttpClient httpClient = new HttpClient();
                    // 服务接口
                    apiService = httpClient.getRetrofit().create(ApiService.class);
                }
            }
        }
        return netWork;
    }

    //登录 示例

    public void doLogin(String userName, String password, NetBackListener<ResLogin> listener) {
        apiService.doLogin(userName, password)
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new NetObserver<ResBean<ResLogin>>() {
                    @Override
                    protected void onSuccess(ResBean<ResLogin> data) {
                        if (data.code == SUCCESS_CODE) {

                            if (data.data == null) {
                                listener.onEmpty();
                            } else {
                                listener.onSuccess(data.data);
                            }
                        } else {
                            listener.onError(data.msg);
                        }
                    }

                    @Override
                    protected void onFailure(String failureMsg) {
                        listener.onError(failureMsg);
                    }
                });
    }
}

封装数据返回 Bean

public class ResBean<T> {

    public String msg;
    public int code;
    public T data;
}


public class ResLogin {
	// 你自己的 login 返回 data 的内容
}

至此 ,retrofit2 + rxjava2 简单封装结束。


版权声明:本文为weixin_43502791原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。