[Android开源框架]RxHttp使用说明

作者: goweii | 来源:发表于2018-10-18 11:13 被阅读48次

RxHttp

对RxJava2+Retrofit2+OkHttp3的封装,优雅实现接口请求和文件下载

GitHub主页

Demo下载

功能简介

  • 网络请求(RxRequest)
    • 监听请求声明周期,如开始结束和网络错误等
    • 支持多BaseUrl,可针对不同请求重定向
    • 支持无网强制获取缓存数据
    • 支持添加公共请求参数
    • 支持自定义异常处理和异常提示消息
  • 文件下载(RxDownload)
    • 支持断点续传
    • 支持下载进度回调
    • 支持下载速度回调

集成方式

  1. 在Project的build.gradle添加仓库地址

    allprojects {
     repositories {
         ...
         maven { url 'https://www.jitpack.io' }
     }
    }
    
  2. 在Model:app的build.gradle添加框架依赖

    最新版本是多少,看下Releases

    dependencies {
     api 'com.github.goweii:RxHttp:最新版本号'
    }
    

RxRequest

使用方法

初始化

初始化操作可在Application中也可在应用启动页中进行

RxHttp.init(this);
RxHttp.initRequest(new DefaultRequestSetting() {
            @Override
            public String getBaseUrl() {
                return Config.BASE_URL;
            }

            @Override
            public int getSuccessCode() {
                return 200;
            }
        });

定义响应体结构

定义ResponseBean<E>继承BaseResponse<E>,定义成员变量并实现方法。

public class ResponseBean<E> implements BaseResponse<E> {
    @SerializedName(value = "code", alternate = {"status"})
    private int code;
    @SerializedName(value = "data", alternate = {"result"})
    private E data;
    @SerializedName(value = "msg", alternate = {"message"})
    private String msg;

    @Override
    public int getCode() {
        return code;
    }

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

    @Override
    public E getData() {
        return data;
    }

    @Override
    public void setData(E data) {
        this.data = data;
    }

    @Override
    public String getMsg() {
        return msg;
    }

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

定义接口数据结构

public class TimeBean extends BaseBean {
    private String time;

    public String getTime() {
        return time;
    }

    public void setTime(String time) {
        this.time = time;
    }
}

定义Api接口类

  1. 新建子类继承自Api
  2. 定义一个内部类Service声明请求(即Retrifit的CategoryService)
  3. 定义静态无参方法返回Api.api(Service.class)创建Api实例
public class FreeApi extends Api {

    public static Service api() {
        return Api.api(Service.class);
    }

    public interface Service {
        @GET("public/time")
        Observable<ResponseBean<TimeBean>> getTime();
    }
}

发起请求

你可以在Activity或者Fragment中发起请求,也可以在你的Presenter层中发起请求,只需要注意请求生命周期的管理。

使用时分为3步处理:

  1. 在onCreate方法中(如果是Presenter中使用应该在其绑定到视图时)调用RxLife.create()方法,该方法会返回一个RxLife实例mRxLife。
  2. 在onDestroy方法中(如果是Presenter中使用应该在其从视图解除绑定时)调用mRxLife.destroy()方法,该方法会自动中断所有未完成的请求,防止内存泄漏。
  3. 调用RxHttp.request(Observable)或者RxRequest.create(Observable)方法发起一个请求,会返回一个Disposable对象,调用mRxLife.add(Disposable)添加至管理队列。
private RxLife mRxLife;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_test_request);
    mRxLife = RxLife.create();
}

@Override
protected void onDestroy() {
    super.onDestroy();
    mRxLife.destroy();
}

private void getTime() {
    mRxLife.add(RxHttp.request(FreeApi.api().getTime()).listener(new RxRequest.RequestListener() {
        private long timeStart = 0;

        @Override
        public void onDownloading() {
            log(null);
            log("onDownloading()");
            timeStart = System.currentTimeMillis();
        }

        @Override
        public void onError(ExceptionHandle handle) {
            log("onError(" + handle.getMsg() + ")");
        }

        @Override
        public void onStopped() {
            long cast = System.currentTimeMillis() - timeStart;
            log("onStopped(cast=" + cast + ")");
        }
    }).request(new RxRequest.ResultCallback<TimeBean>() {
        @Override
        public void onSuccess(int code, TimeBean data) {
            log("onSuccess(code=" + code + ",data=" + data.toFormatJson() + ")");
        }

        @Override
        public void onFailed(int code, String msg) {
            log("onFailed(code=" + code + ",msg=" + msg + ")");
        }
    }));
}

常用类说明

RxHttp

用于初始化和设置

RequestSetting/DefaultRequestSetting

RxRequest的设置

  • String getBaseUrl()

  • 默认的BaseUrl

  • Map<String, String> getMultiBaseUrl()

    其他用于重定向的BaseUrl,Map的Key值为添加重定向Header的Value值,Map的Value值为BaseUrl

  • int getSuccessCode()

    请求成功后服务器返回的成功Code值

  • int[] getMultiSuccessCode()

    请求成功后服务器返回的其他成功Code值

  • long getTimeout()

    超时时间

  • String getCacheDirName()

    缓存文件夹名

  • long getCacheSize()

    缓存大小

  • Map<String, String> getStaticPublicQueryParameter()

    拼接在url后面的公共请求参数,静态字符串,如版本号等

  • Map<String, ParameterGetter> getDynamicPublicQueryParameter()

    拼接在url后面的公共请求参数,需要动态获取的,如用户名等

  • < E extends ExceptionHandle> E getExceptionHandle()

    获取自定义异常处理器

  • Interceptor[] getInterceptors()

    添加自定义拦截器

  • Interceptor[] getNetworkInterceptors()

    添加自定义拦截器

ExceptionHandle

处理请求过程中的异常,可通过继承自定义。

  • onGetCode(Throwable)

    重写该方法去返回异常对应的错误码

  • onGetMsg(int)

    重写该方法去返回错误码对应的错误信息

Api

  • Header内部类

    • BASE_URL_REDIRECT

      用于BaseUrl的重定向

    • CACHE_ALIVE_SECOND

      指定一个int值用于设置缓存有效时长(秒)。配置后,在无网时强制使用缓存数据,有网时,如果小于等于0则强制联网获取,大于0则在改时间间隔内使用缓存,过期后联网获取。

  • api(Class< T>)静态方法

    创建Api接口实例

RxRequest

用于发起请求

  • create(Observable< R>)

    创建实例,传入参数为一个可观察对象,应该为Api接口返回

  • listener(RequestListener)

    监听请求的生命周期

    • onDownloading()

      请求开始

    • onError(ExceptionHandle)

      请求出错,请见ExceptionHandle

    • onStopped()

      请求结束

  • request(ResultCallback< E>)

    请求成功

    • onSuccess(int, E)

      服务器返回成功code

    • onFailed(int, String)

      服务器返回失败code

JsonFieldUtils

创建Json结构的数据

ParameterUtils

构建Map<String, RequestBody>

RxDownload

使用方法

初始化

初始化操作可在Application中也可在应用启动页中进行

RxHttp.init(this);
RxHttp.initDownload(new DefaultDownloadSetting() {
            @Override
            public long getTimeout() {
                return 60000;
            }
        });

调用

RxDownload mRxDownload = RxDownload.create(et_url.getText().toString())
        .setDownloadListener(new RxDownload.DownloadListener() {
            @Override
            public void onStarting() {
                tv_start.setText("正在开始...");
            }

            @Override
            public void onDownloading() {
                tv_start.setText("正在下载");
            }

            @Override
            public void onError(Throwable e) {
                tv_start.setText("下载失败");
            }

            @Override
            public void onStopped() {
                tv_start.setText("已停止");
            }

            @Override
            public void onCanceled() {
                tv_start.setText("已取消");
                pb_1.setProgress(0);
            }

            @Override
            public void onCompletion(DownloadInfo info) {
                tv_start.setText("下载成功");
            }
        })
        .setProgressListener(new RxDownload.ProgressListener() {
            @Override
            public void onProgress(float progress) {
                pb_1.setProgress((int) (progress * 100));
            }
        })
        .setSpeedListener(new RxDownload.SpeedListener() {
            @Override
            public void onSpeedChange(float bytePerSecond, String speedFormat) {
                tv_start.setText("正在下载(" + speedFormat + ")");
            }
        });

tv_start.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        mRxDownload.start();
    }
});

tv_stop.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        mRxDownload.stop();
    }
});

tv_cancel.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        mRxDownload.cancel();
    }
});

常用类说明

RxHttp

用于初始化和设置

DownloadSetting/DefaultDownloadSetting

RxDownload的设置

  • String getBaseUrl()

    指定默认BaseUrl,传入一个合法的就可以了

  • long getTimeout()

    指定超时时间,建议长一点,如60秒

  • String getSaveDirName()

    指定默认的下载文件夹路径

DownloadInfo

用于保存下载信息,如需断点续传,需要自己保存以下几个必传项

  • String url

    下载文件的链接(必传项)

  • String saveDirName

    自定义下载文件的保存目录(断点续传时必传项)

  • String saveFileName

    自定义下载文件的保存文件名,需带后缀名(断点续传时必传项)

  • long downloadLength

    已下载文件的长度(断点续传时必传项)

  • long contentLength

    下载文件的总长度

  • State state

    当前下载状态

RxDownload

  • create(String)

    用于新建一个下载任务,参数为下载地址

  • create(String, String, String)

    用于新建一个下载任务,参数为下载地址、保存目录、保存文件名

  • create(String, String, String,long)

    用于新建一个断点续传下载任务,参数为下载地址、保存目录、保存文件名、已下载长度

  • setDownloadListener(DownloadListener)

    设置下载状态监听

    • onStarting()

      正在开始,正在连接服务器

    • onDownloading()

      正在下载

    • onStopped()

      已停止,不会删除已下载部分,支持断点续传

    • onCanceled()

      已取消,会删除已下载的部分文件,再次开始会重新下载

    • onCompletion(DownloadInfo)

      下载完成

    • onError(Throwable)

      下载出错

  • setProgressListener(ProgressListener)

    • onProgress(float)

      下载进度回调(0~1)

  • setSpeedListener(SpeedListener)

    • onSpeedChange(float, String)

      下载速度回调,两个值分别为每秒下载比特数和格式化后速度(如:1.2KB/s,3.24MB/s)

  • start()

    开始下载/继续下载

  • stop()

    停止下载,不会删除已下载部分,支持断点续传

  • cancel()

    取消下载,会删除已下载的部分文件,再次开始会重新下载

UnitFormatUtils

单位格式化工具

  • calculateSpeed(long, float)

    计算速度

  • formatSpeedPerSecond(float)

    格式化速度(如:1.12MB/s,628KB/s)

  • formatSpeed(float,TimeUnit)

    格式化速度(如:1.12MB/s,628KB/s)

  • formatBytesLength(float)

    格式化比特值(如:12.1KB,,187.24MB,154GB)

  • formatTimeUnit(TimeUnit)

    格式化时间单位(如:秒为s,毫秒为ms)

相关文章

网友评论

    本文标题:[Android开源框架]RxHttp使用说明

    本文链接:https://www.haomeiwen.com/subject/uiyjzftx.html