Android RxHttp在实战中的运用

至于RxHttp是什么,在这里就不讲了,有需要的可以前往查看RxHttp详解Github讲解

RxHttp如何实现像Retrfit+RxJava那样链式多条请求的请移步

本篇主要来看一下在实战中是如何运用的
1、导入相关的库文件

	implementation 'com.rxjava.rxhttp:rxhttp:2.1.0' //必须
    annotationProcessor 'com.rxjava.rxhttp:rxhttp-compiler:2.1.0' //注解处理器,生成RxHttp类,必须
    implementation 'com.rxjava.rxlife:rxlife-x:2.0.0'
    implementation 'io.reactivex.rxjava2:rxandroid:2.1.1'
    implementation 'com.squareup.okhttp3:logging-interceptor:3.8.0'

2、支持JDK8

	compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }

3、工具类

import android.text.TextUtils;
import androidx.fragment.app.FragmentActivity;
import com.rxjava.rxlife.RxLife;

import java.io.File;
import java.util.Map;
import java.util.concurrent.TimeUnit;

import io.reactivex.ObservableSource;
import io.reactivex.Observer;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.disposables.Disposable;
import io.reactivex.functions.Consumer;
import io.reactivex.functions.Function;
import okhttp3.OkHttpClient;
import okhttp3.logging.HttpLoggingInterceptor;
import rxhttp.wrapper.annotation.DefaultDomain;
import rxhttp.wrapper.entity.Progress;
import rxhttp.wrapper.param.RxHttp;

/**
 * FileName: RxhttpUtil
 * Author: admin
 * Date: 2020/5/14 15:27
 * Description:
 */
public class RxhttpUtil {

    @DefaultDomain
    public static String baseUrl = "http://www.baidu.com/";

    private static volatile RxhttpUtil instance = null;

    public static RxhttpUtil getInstance() {
        if (instance == null) {
            synchronized (RxhttpUtil.class) {
                if (instance == null) {
                    instance = new RxhttpUtil();
                }
            }
        }
        return instance;
    }

    /**
     * 初始化RxHttp
     *
     * @param debug false:非debug模式,true:debug模式
     * @param url   更换BaseUrl
     */
    public static void init(boolean debug, String url) {
        if (!TextUtils.isEmpty(url)) {
            baseUrl = url;
        }
        setOkhttp(debug);
    }

    /**
     * 初始化RxHttp
     *
     * @param debug false:非debug模式,true:debug模式
     */
    public static void init(boolean debug) {
        setOkhttp(debug);
    }

    private static void setOkhttp(boolean debug) {
        OkHttpClient.Builder builder = new OkHttpClient.Builder()
                .readTimeout(30 * 1000, TimeUnit.MILLISECONDS)
                .writeTimeout(30 * 1000, TimeUnit.MILLISECONDS)
                .connectTimeout(30 * 1000, TimeUnit.MILLISECONDS);
        /**
         * 注入请求日志
         */
        HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor();
        loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
        builder.addInterceptor(loggingInterceptor);
        RxHttp.init(builder.build(), debug);
    }

    /**
     * get 请求
     *
     * @param url          接口地址
     * @param a
     * @param httpCallBack
     */
    public void get(String url, FragmentActivity a, RxHttpCallBack httpCallBack) {
        RxHttp.get(url)
                .asString()
                .observeOn(AndroidSchedulers.mainThread())
                .as(RxLife.asOnMain(a))
                .subscribe(new Observer<String>() {
                    @Override
                    public void onSubscribe(Disposable d) {
                        httpCallBack.onStart();
                    }

                    @Override
                    public void onNext(String s) {
                        httpCallBack.onSuccess(s);
                    }

                    @Override
                    public void onError(Throwable e) {
                        httpCallBack.onError(e.getMessage());
                    }

                    @Override
                    public void onComplete() {
                        httpCallBack.onFinish();
                    }
                });
    }

    /**
     * get 请求
     *
     * @param url          接口地址
     * @param map          请求参数
     * @param a
     * @param httpCallBack
     */
    public void get(String url, Map<String, String> map, FragmentActivity a, RxHttpCallBack httpCallBack) {
        RxHttp.get(url)
                .addAll(map)
                .asString()
                .observeOn(AndroidSchedulers.mainThread())
                .as(RxLife.asOnMain(a))
                .subscribe(new Observer<String>() {
                    @Override
                    public void onSubscribe(Disposable d) {
                        httpCallBack.onStart();
                    }

                    @Override
                    public void onNext(String s) {
                        httpCallBack.onSuccess(s);
                    }

                    @Override
                    public void onError(Throwable e) {
                        httpCallBack.onError(e.getMessage());
                    }

                    @Override
                    public void onComplete() {
                        httpCallBack.onFinish();
                    }
                });
    }

    /**
     * get请求
     *
     * @param url            接口地址
     * @param map            请求参数
     * @param rxBaseResponse 请求返回的数据对象
     * @param a
     * @param httpResponse
     */
    public void get(String url, Map<String, String> map, RxBaseResponse rxBaseResponse, FragmentActivity a, RxHttpResponse httpResponse) {
        RxHttp.get(url)
                .addAll(map)
                .asResponse(rxBaseResponse.getClass())
                .observeOn(AndroidSchedulers.mainThread())
                .as(RxLife.asOnMain(a))
                .subscribe(new Observer<RxBaseResponse>() {
                    @Override
                    public void onSubscribe(Disposable d) {
                        httpResponse.onStart();
                    }

                    @Override
                    public void onNext(RxBaseResponse rxBaseResponse) {
                        httpResponse.onSuccess(rxBaseResponse);
                    }

                    @Override
                    public void onError(Throwable e) {
                        httpResponse.onError(e.getMessage());
                    }

                    @Override
                    public void onComplete() {
                        httpResponse.onFinish();
                    }
                });
    }

    /**
     * post请求
     *
     * @param url          接口地址
     * @param map          请求参数
     * @param a
     * @param httpCallBack
     */
    public void post(String url, Map<String, String> map, FragmentActivity a, RxHttpCallBack httpCallBack) {
        RxHttp.postForm(url)
                .addAll(map)
                .asString()
                .observeOn(AndroidSchedulers.mainThread())
                .as(RxLife.asOnMain(a))
                .subscribe(new Observer<String>() {
                    @Override
                    public void onSubscribe(Disposable d) {
                        httpCallBack.onStart();
                    }

                    @Override
                    public void onNext(String s) {
                        httpCallBack.onSuccess(s);
                    }

                    @Override
                    public void onError(Throwable e) {
                        httpCallBack.onError(e.getMessage());
                    }

                    @Override
                    public void onComplete() {
                        httpCallBack.onFinish();
                    }
                });
    }

    /**
     * post请求
     *
     * @param url          接口地址
     * @param map          请求参数
     * @param baseResponse 请求返回的数据对象
     * @param a
     * @param httpCallBack
     */
    public void post(String url, Map<String, String> map, RxBaseResponse baseResponse, FragmentActivity a, RxHttpResponse httpCallBack) {
        RxHttp.postForm(url)
                .addAll(map)
                .asObject(baseResponse.getClass())
                .observeOn(AndroidSchedulers.mainThread())
                .as(RxLife.asOnMain(a))
                .subscribe(new Observer<RxBaseResponse>() {
                    @Override
                    public void onSubscribe(Disposable d) {
                        httpCallBack.onStart();
                    }

                    @Override
                    public void onNext(RxBaseResponse s) {
                        httpCallBack.onSuccess(s);
                    }

                    @Override
                    public void onError(Throwable e) {
                        httpCallBack.onError(e.getMessage());
                    }

                    @Override
                    public void onComplete() {
                        httpCallBack.onFinish();
                    }
                });
    }

    /**
     * post表单请求
     *
     * @param url          接口地址
     * @param map          请求参数
     * @param a
     * @param httpCallBack
     */
    public void postFrom(String url, Map<String, String> map, FragmentActivity a, RxHttpCallBack httpCallBack) {
        RxHttp.postForm(url)
                .addAll(map)
                .asString()
                .observeOn(AndroidSchedulers.mainThread())
                .as(RxLife.asOnMain(a))     //界面销毁,自动关闭请求
                .subscribe(new Observer<String>() {
                    @Override
                    public void onSubscribe(Disposable d) {
                        httpCallBack.onStart();
                    }

                    @Override
                    public void onNext(String s) {
                        httpCallBack.onSuccess(s);
                    }

                    @Override
                    public void onError(Throwable e) {
                        httpCallBack.onError(e.getMessage());
                    }

                    @Override
                    public void onComplete() {
                        httpCallBack.onFinish();
                    }
                });
    }

    /**
     * 上传文件
     *
     * @param url        上传地址
     * @param key        文件key
     * @param filePath   本地文件地址
     * @param rxHttpFile 上传回调
     */
    public void uploadFile(String url, String key, String filePath, FragmentActivity a, RxHttpFile rxHttpFile) {
        RxHttp.postForm(url) //发送Form表单形式的Post请求
                .addFile(key, new File(filePath))
                .asUpload(new Consumer<Progress>() {
                    @Override
                    public void accept(Progress progress) throws Exception {
                        rxHttpFile.onProgress(progress.getProgress(), progress.getCurrentSize(), progress.getTotalSize());
                    }
                }, AndroidSchedulers.mainThread())
                .as(RxLife.asOnMain(a))
                .subscribe(new Observer<String>() {
                    @Override
                    public void onSubscribe(Disposable d) {
                        rxHttpFile.onStart();
                    }

                    @Override
                    public void onNext(String s) {
                        rxHttpFile.onSuccess(s);
                    }

                    @Override
                    public void onError(Throwable e) {
                        rxHttpFile.onError(e.getMessage());
                    }

                    @Override
                    public void onComplete() {
                        rxHttpFile.onFinish();
                    }
                });
    }

    /**
     * 文件下载
     *
     * @param httpUrl  下载的文件网络位置
     * @param filePath 下载到本地的位置
     * @param a        activity
     * @param httpFile 下载回调
     */
    public void downloadFile(String httpUrl, String filePath, FragmentActivity a, RxHttpFile httpFile) {
        RxHttp.get(httpUrl)
                .asDownload(filePath, new Consumer<Progress>() {
                    @Override
                    public void accept(Progress progress) throws Exception {
                        httpFile.onProgress(progress.getProgress(), progress.getCurrentSize(), progress.getTotalSize());
                    }
                }, AndroidSchedulers.mainThread()) //指定主线程回调
                .as(RxLife.asOnMain(a))
                .subscribe(new Observer<String>() {
                    @Override
                    public void onSubscribe(Disposable d) {
                        httpFile.onStart();
                    }

                    @Override
                    public void onNext(String s) {
                        httpFile.onSuccess(s);
                    }

                    @Override
                    public void onError(Throwable e) {
                        httpFile.onError(e.getMessage());
                    }

                    @Override
                    public void onComplete() {
                        httpFile.onFinish();
                    }
                });
    }

    /**
     * 链式请求实例,可根据实际需求做调整
     *
     * @param a
     * @param url1 第一个接口地址
     * @param url2 第二个接口地址
     * @param map1 第一个接口请求的参数
     * @param map2 第二个接口请求的参数
     */
    public void post(FragmentActivity a, String url1, String url2, Map<String, String> map1, Map<String, String> map2, RxHttpCallBack callBack) {
        RxHttp.postForm(url1)
                .addAll(map1)
                .asString()
                .flatMap(new Function<String, ObservableSource<?>>() {
                    @Override
                    public ObservableSource<?> apply(String s) throws Exception {
                        return RxHttp.get(url2)
                                .addAll(map2)
                                .subscribeOnCurrent()
                                .asString();
                    }
                })
                .as(RxLife.asOnMain(a))
                .subscribe(new Observer<Object>() {
                    @Override
                    public void onSubscribe(Disposable d) {
                        callBack.onStart();
                    }

                    @Override
                    public void onNext(Object o) {
                        callBack.onSuccess(o.toString());
                    }

                    @Override
                    public void onError(Throwable e) {
                        callBack.onError(e.toString());
                    }

                    @Override
                    public void onComplete() {
                        callBack.onFinish();
                    }
                });
    }

    public interface RxHttpCallBack {
        /**
         * 开始请求
         */
        void onStart();

        /**
         * 请求成功
         *
         * @param response
         */
        void onSuccess(String response);

        /**
         * 请求异常
         *
         * @param error
         */
        void onError(String error);

        /**
         * 请求结束
         */
        void onFinish();
    }

    public interface RxHttpResponse {
        /**
         * 开始请求
         */
        void onStart();

        /**
         * 请求成功
         *
         * @param response
         */
        void onSuccess(RxBaseResponse response);

        /**
         * 请求异常
         *
         * @param error
         */
        void onError(String error);

        /**
         * 请求结束
         */
        void onFinish();
    }

    public interface RxHttpFile {
        /**
         * 开始请求
         */
        void onStart();

        /**
         * 请求成功
         *
         * @param response
         */
        void onSuccess(String response);

        /**
         * 上传进度或下载进度
         *
         * @param progress    当前进度
         * @param currentSize 已上传或下载字节大小
         * @param totalSize   总字节大小
         */
        void onProgress(int progress, long currentSize, long totalSize);

        /**
         * 请求异常
         *
         * @param error
         */
        void onError(String error);

        /**
         * 请求结束
         */
        void onFinish();
    }
}

如果需要请求结果返回对象可进行简单封装

public abstract class RxBaseResponse<T> {
    private int code;
    private String msg;
    private T data;

    public int getCode() {
        return code;
    }

    public void setCode(int code) {
        this.code = code;
    }

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }

    public T getData() {
        return data;
    }

    public void setData(T data) {
        this.data = data;
    }
}

解析器

@Parser(name = "Response")
public class RxResponseParser<T> extends AbstractParser<T> {

    protected RxResponseParser() {
        super();
    }

    public RxResponseParser(Type type) {
        super(type);
    }

    @Override
    public T onParse(okhttp3.Response response) throws IOException {
        final Type type = ParameterizedTypeImpl.get(RxBaseResponse.class, mType); //获取泛型类型
        RxBaseResponse<T> data = convert(response, type);
        T t = data.getData(); //获取data字段
        if (data.getCode() != 200 || t == null) {//这里假设code不等于200,代表数据不正确,抛出异常
            throw new ParseException(String.valueOf(data.getCode()), data.getMsg(), response);
        }
        return t;
    }
}

致辞结束!

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

落魄的Android开发

感谢支持

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值