上面的this为LifecycleOwner接口对象,我们的FragmentActivity/Fragment均实现了这个接口,所有我们在FragmentActivity/Fragment中可以直接传this 。对RxLife不了解的同学请查看RxLife 史上最优雅的管理RxJava生命周期,这里不详细讲解 。
3.7.2、手动关闭请求
手动关闭请求,我们只需要在订阅回调的时候拿到Disposable对象,通过该对象可以判断请求是否结束,如果没有,就可以关闭请求,如下:
//订阅回调,可以拿到Disposable对象Disposable disposable = RxHttp.get("/service/...").asString().subscribe(s -> {//成功回调}, throwable -> {//失败回调});if (!disposable.isDisposed()) {//判断请求有没有结束disposable.dispose();//没有结束,则关闭请求}
3.8、文件上传/下载/进度监听RxHttp可以非常优雅的实现上传/下载及进度的监听,是骡子是马,拉出来溜溜
3.8.1上传
通过addFile系列方法添加文件,如下:
RxHttp.postForm("/service/...") //发送Form表单形式的Post请求.addFile("file1", new File("xxx/1.png"))//添加单个文件.addFile("fileList", new ArrayList<>())//通过List对象,添加多个文件.asString().subscribe(s -> {//上传成功}, throwable -> {//上传失败});
通过asUpload系列方法监听上传进度,如下:
RxHttp.postForm("/service/...") //发送Form表单形式的Post请求.addFile("file1", new File("xxx/1.png")).addFile("file2", new File("xxx/2.png")).asUpload(progress -> {//上传进度回调,0-100,仅在进度有更新时才会回调int currentProgress = progress.getProgress(); //当前进度 0-100long currentSize = progress.getCurrentSize(); //当前已上传的字节大小long totalSize = progress.getTotalSize();//要上传的总字节大小}, AndroidSchedulers.mainThread())//指定回调(进度/成功/失败)线程,不指定,默认在请求所在线程回调.subscribe(s -> {//上传成功}, throwable -> {//上传失败});
可以看到,跟上传的代码相比,我们仅仅是使用了asUpload(Consumer, Scheduler)方法替换asString()方法,第一个参数是进度监听接口,每当进度有更新时,都会回调该接口,第二个参数是指定回调的线程,这里我们指定了在UI线程中回调 。
3.8.2、下载
下载使用asDownload(String)方法,传入本地路径即可
//文件存储路径String destPath = getExternalCacheDir() + "/" + System.currentTimeMillis() + ".apk";RxHttp.get("http://update.9158.com/miaolive/Miaolive.apk").asDownload(destPath) //注意这里使用asDownload操作符,并传入本地路径.subscribe(s -> {//下载成功,回调文件下载路径}, throwable -> {//下载失败});
3.8.3、带进度下载
带进度下载使用asDownload(String,Consumer,Scheduler)方法
//文件存储路径String destPath = getExternalCacheDir() + "/" + System.currentTimeMillis() + ".apk";RxHttp.get("http://update.9158.com/miaolive/Miaolive.apk").asDownload(destPath, progress -> {//下载进度回调,0-100,仅在进度有更新时才会回调,最多回调101次,最后一次回调文件存储路径int currentProgress = progress.getProgress(); //当前进度 0-100long currentSize = progress.getCurrentSize(); //当前已下载的字节大小long totalSize = progress.getTotalSize();//要下载的总字节大小}, AndroidSchedulers.mainThread()) //指定主线程回调.subscribe(s -> {//s为String类型,这里为文件存储路径//下载完成,处理相关逻辑}, throwable -> {//下载失败,处理相关逻辑});
3.8.4、断点下载
断点下载相较于下载,仅需要调用setRangeHeader(long startIndex, long endIndex)方法传入开始及结束位置即可(结束位置不传默认为文件末尾),其它没有任何差别
String destPath = getExternalCacheDir() + "/" + "Miaobo.apk";long length = new File(destPath).length(); //已下载的文件长度RxHttp.get("http://update.9158.com/miaolive/Miaolive.apk").setRangeHeader(length)//设置开始下载位置,结束位置默认为文件末尾.asDownload(destPath).subscribe(s -> { //s为String类型//下载成功,处理相关逻辑}, throwable -> {//下载失败,处理相关逻辑});
3.8.5、带进度断点下载
带进度断点下载相较于带进度下载仅需要调用setRangeHeader方法传入开始及结束位置即可(结束位置不传默认为文件末尾),其它没有任何差别
String destPath = getExternalCacheDir() + "/" + "Miaobo.apk";long length = new File(destPath).length(); //已下载的文件长度RxHttp.get("http://update.9158.com/miaolive/Miaolive.apk").setRangeHeader(length)//设置开始下载位置,结束位置默认为文件末尾.asDownload(destPath, progress -> {//下载进度回调,0-100,仅在进度有更新时才会回调int currentProgress = progress.getProgress(); //当前进度 0-100long currentSize = progress.getCurrentSize(); //当前已下载的字节大小long totalSize = progress.getTotalSize();//要下载的总字节大小}, AndroidSchedulers.mainThread()) //指定主线程回调.subscribe(s -> { //s为String类型//下载成功,处理相关逻辑}, throwable -> {//下载失败,处理相关逻辑});
推荐阅读
- 给你百万年薪,让你担任公司的架构师,你知道该做哪些事吗?
- 治眼疾茶方推荐
- 台灯什么角度最保护眼睛,写作业台灯的正确摆放位置
- 怎样看台灯伤不伤眼睛,台灯闪烁会伤眼睛吗
- 肚脐眼到底能不能抠?抠了会什么样的后果,你知道吗
- 索隆的眼睛怎么回事 索隆的一只眼睛怎么瞎的
- 10款自制减肥茶 让你轻松享瘦
- 阴阳眼可以看见什么 阴阳眼的人能看到什么
- 减辐射护眼睛 每天宜喝四杯茶
- 双眼皮疤痕增生的前兆有哪些