package com.example.retrofit.downlaod;
import com.example.retrofit.downlaod.DownLoadListener.DownloadInterceptor;
import com.example.retrofit.exception.HttpTimeException;
import com.example.retrofit.exception.RetryWhenNetworkException;
import com.example.retrofit.http.HttpService;
import java.io.File;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.nio.MappedByteBuffer;
import java.nio.channels.FileChannel;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Set;
import java.util.concurrent.TimeUnit;
import okhttp3.OkHttpClient;
import okhttp3.ResponseBody;
import retrofit2.Retrofit;
import retrofit2.adapter.rxjava.RxJavaCallAdapterFactory;
import retrofit2.converter.gson.GsonConverterFactory;
import rx.android.schedulers.AndroidSchedulers;
import rx.functions.Func1;
import rx.schedulers.Schedulers;
/**
* http下载处理类
* Created by WZG on 2016/7/16.
*/
public class HttpDownManager {
/*记录下载数据*/
private Set<DownInfo> downInfos;
/*回调sub队列*/
private HashMap<String,ProgressDownSubscriber> subMap;
/*单利对象*/
private volatile static HttpDownManager INSTANCE;
private HttpDownManager(){
downInfos=new HashSet<>();
subMap=new HashMap<>();
}
/**
* 获取单例
* @return
*/
public static HttpDownManager getInstance() {
if (INSTANCE == null) {
synchronized (HttpDownManager.class) {
if (INSTANCE == null) {
INSTANCE = new HttpDownManager();
}
}
}
return INSTANCE;
}
/**
* 开始下载
*/
public void startDown(DownInfo info){
/*正在下载不处理*/
if(info==null||subMap.get(info.getUrl())!=null){
return;
}
/*添加回调处理类*/
ProgressDownSubscriber subscriber=new ProgressDownSubscriber(info);
/*记录回调sub*/
subMap.put(info.getUrl(),subscriber);
/*获取service,多次请求公用一个sercie*/
HttpService httpService;
if(downInfos.contains(info)){
httpService=info.getService();
}else{
DownloadInterceptor interceptor = new DownloadInterceptor(subscriber);
OkHttpClient.Builder builder = new OkHttpClient.Builder();
//手动创建一个OkHttpClient并设置超时时间
builder.connectTimeout(info.getConnectionTime(), TimeUnit.SECONDS);
builder.addInterceptor(interceptor);
Retrofit retrofit = new Retrofit.Builder()
.client(builder.build())
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.baseUrl(info.getBaseUrl())
.build();
httpService= retrofit.create(HttpService.class);
info.setService(httpService);
}
/*得到rx对象-上一次下載的位置開始下載*/
httpService.download("bytes=" + info.getReadLength() + "-",info.getUrl())
/*指定线程*/
.subscribeOn(Schedulers.io())
.unsubscribeOn(Schedulers.io())
/*失败后的retry配置*/
.retryWhen(new RetryWhenNetworkException())
/*读取下载写入文件*/
.map(new Func1<ResponseBody, DownInfo>() {
@Override
public DownInfo call(ResponseBody responseBody) {
try {
writeCache(responseBody,new File(info.getSavePath()),info);
} catch (IOException e) {
/*失败抛出异常*/
throw new HttpTimeException(e.getMessage());
}
return info;
}
})
/*回调线程*/
.observeOn(AndroidSchedulers.mainThread())
/*数据回调*/
.subscribe(subscriber);
}
/**
* 停止下载
*/
public void stopDown(DownInfo info){
if(info==null)return;
info.setState(DownState.STOP);
info.getListener().onStop();
if(subMap.containsKey(info.getUrl())) {
ProgressDownSubscriber subscriber=subMap.get(info.getUrl());
subscriber.unsubscribe();
subMap.remove(info.getUrl());
}
/*同步数据库*/
}
/**
* 删除
* @param info
*/
public void deleteDown(DownInfo info){
stopDown(info);
/*删除数据库信息和本地文件*/
}
/**
* 暂停下载
* @param info
*/
public void pause(DownInfo info){
if(info==null)return;
info.setState(DownState.PAUSE);
info.getListener().onPuase();
if(subMap.containsKey(info.getUrl())){
ProgressDownSubscriber subscriber=subMap.get(info.getUrl());
subscriber.unsubscribe();
subMap.remove(info.getUrl());
}
/*这里需要讲info信息写入到数据中,可自由扩展,用自己项目的数据库*/
}
/**
* 停止全部下载
*/
public void stopAllDown(){
for (DownInfo downInfo : downInfos) {
stopDown(downInfo);
}
subMap.clear();
downInfos.clear();
}
/**
* 暂停全部下载
*/
public void pauseAll(){
for (DownInfo downInfo : downInfos) {
pause(downInfo);
}
subMap.clear();
downInfos.clear();
}
/**
* 返回全部正在下载的数据
* @return
*/
public Set<DownInfo> getDownInfos() {
return downInfos;
}
/**
* 写入文件
* @param file
* @param info
* @throws IOException
*/
public void writeCache(ResponseBody responseBody,File file,DownInfo info) throws IOException{
if (!file.getParentFile().exists())
file.getParentFile().mkdirs();
long allLength;
if (info.getCountLength()==0){
allLength=responseBody.contentLength();
}else{
allLength=info.getCountLength();
}
FileChannel channelOut = null;
RandomAccessFile randomAccessFile = null;
randomAccessFile = new RandomAccessFile(file, "rwd");
channelOut = randomAccessFile.getChannel();
MappedByteBuffer mappedBuffer = channelOut.map(FileChannel.MapMode.READ_WRITE,
info.getReadLength(),allLength-info.getReadLength());
byte[] buffer = new byte[1024*8];
int len;
int record = 0;
while ((len = responseBody.byteStream().read(buffer)) != -1) {
mappedBuffer.put(buffer, 0, len);
record += len;
}
responseBody.byteStream().close();
if (channelOut != null) {
channelOut.close();
}
if (randomAccessFile != null) {
randomAccessFile.close();
}
}
}
没有合适的资源?快使用搜索试试~ 我知道了~
Rxjava+ReTrofit+okHttp深入浅出-终极封装三(多文件下载之断点续传)
共43个文件
java:14个
xml:9个
png:5个
5星 · 超过95%的资源 需积分: 49 832 下载量 118 浏览量
2016-10-24
14:27:35
上传
评论 4
收藏 102KB RAR 举报
温馨提示
rxjava+retrofit+okhttp集合的封装断点续传下载一直是移动开发中必不可少的一项重要的技术,同样的Rxjava和Retrofit的结合让这个技术解决起来更加的灵活,我们完全可以封装一个适合自的下载框架,简单而且安全!
资源推荐
资源详情
资源评论
收起资源包目录
RxjavaRetrofitDemo-master.rar (43个子文件)
RxjavaRetrofitDemo-master
.gitignore 105B
app
.gitignore 8B
build.gradle 1KB
src
main
AndroidManifest.xml 1KB
res
mipmap-xhdpi
ic_launcher.png 5KB
mipmap-mdpi
ic_launcher.png 2KB
layout
activity_down_laod.xml 898B
view_item_holder.xml 1KB
activity_main.xml 2KB
values-w820dp
dimens.xml 364B
mipmap-xxhdpi
ic_launcher.png 8KB
mipmap-hdpi
ic_launcher.png 3KB
mipmap-xxxhdpi
ic_launcher.png 10KB
values
strings.xml 84B
colors.xml 214B
dimens.xml 216B
styles.xml 394B
java
com
example
retrofit
http
HttpService.java 553B
exception
RetryWhenNetworkException.java 3KB
HttpTimeException.java 877B
listener
HttpProgressOnNextListener.java 933B
downlaod
DownInfo.java 3KB
HttpDownManager.java 7KB
ProgressDownSubscriber.java 3KB
DownLoadListener
DownloadResponseBody.java 2KB
DownloadProgressListener.java 331B
DownloadInterceptor.java 756B
DownState.java 207B
activity
DownLaodActivity.java 2KB
adapter
DownHolder.java 3KB
DownAdapter.java 626B
proguard-rules.pro 706B
app.iml 13KB
settings.gradle 16B
build.gradle 574B
gradlew 5KB
LICENSE 1KB
RxjavaRetrofitDemo-master.iml 879B
gradlew.bat 2KB
gradle.properties 872B
gradle
wrapper
gradle-wrapper.properties 237B
gradle-wrapper.jar 52KB
local.properties 455B
共 43 条
- 1
wzgiceman
- 粉丝: 743
- 资源: 25
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
- 1
- 2
- 3
- 4
前往页