Retrofit多线程下载
来源:互联网 发布:16总决赛骑士数据 编辑:程序博客网 时间:2024/06/08 11:54
retrofit接口类public interface GetInterface {// @GET("iYXEPGn4e9c6dafce6e5cdd23287d2bb136ee7e9194d3e9?uri=vedio")// Observable<Bean> getData_Banner(); @Streaming/*大文件需要加入这个判断,防止下载过程中写入到内存中*/ @GET Observable<ResponseBody> download(@Header("RANGE") String start, @Url String url);}封装的Retrofitpublic class BaseService { public static final String API_BASE_URL = "https://api.github.com"; private static OkHttpClient.Builder httpClient = new OkHttpClient.Builder(); private static Retrofit.Builder builder = new Retrofit.Builder() .baseUrl("http://result.eolinker.com/") .addConverterFactory(GsonConverterFactory.create()) .addCallAdapterFactory(RxJava2CallAdapterFactory.create()); public static <S> S createService(Class<S> serviceClass) { Retrofit retrofit = builder.client(httpClient.build()).build(); return retrofit.create(serviceClass); }}调用public class IdownModel implements IDwonFile { String url3=""; @Override public void getData(String start, String url, final String url2, final GetCallback callback) { this.url3 = url; BaseService.createService(GetInterface.class).download(start, url3) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Observer<ResponseBody>() { @Override public void onSubscribe(Disposable d) { } @Override public void onNext(ResponseBody responseBody) { final long l = responseBody.contentLength(); Log.i("=====length=====", "onNext: " + l); downloadTask(l, url2); } @Override public void onError(Throwable e) { } @Override public void onComplete() { } }); } public void downloadTask(long length, String url2) { final File file = new File(url2); if (!file.exists()) { try { file.createNewFile(); } catch (IOException e) { e.printStackTrace(); } } //例如 1000kb 3 333 int threadNum = 5; long blockSize = length / threadNum; //计算出下载块以后 创建线程执行下载操作 for (int i = 0; i < threadNum; i++) { //计算开始位置 final long startPosition = blockSize * i; //让最后一个线程下载的大小是正好的, 总长度 - 除了最后一个块的大小和 if (i == threadNum - 1) { blockSize = length - blockSize * (threadNum - 1); } //"Range:bytes=0-100" String range = "bytes=" + startPosition + "-" + (startPosition + blockSize - 1); //对于retrofit的网络请求 需要 请求地址 需要设置请求头Range Log.i("====url====", "downloadTask: "+url3); Log.i("====ramge====", "downloadTask: "+range); BaseService.createService(GetInterface.class).download(range, url3) .subscribeOn(Schedulers.io()) .observeOn(Schedulers.io()) .subscribe(new Observer<ResponseBody>() { @Override public void onSubscribe(Disposable d) { } @Override public void onNext(ResponseBody responseBody) { try { BufferedInputStream bis = new BufferedInputStream(responseBody.byteStream()); RandomAccessFile raf = new RandomAccessFile(file, "rwd"); raf.seek(startPosition); byte[] buff = new byte[1024 * 8]; int len = 0; while ((len = bis.read(buff)) != -1) { raf.write(buff, 0, len); } } catch (IOException e) { e.printStackTrace(); } } @Override public void onError(Throwable e) { } @Override public void onComplete() { } }); } }}依赖// Retrofit支持gson解析Gsonconverterfactory compile 'com.squareup.retrofit2:converter-gson:2.1.0'// Retrofit compile 'com.squareup.retrofit2:retrofit:2.0.2'// Okhttp compile 'com.squareup.okhttp3:okhttp:3.1.2'// Rxjava2 compile 'io.reactivex.rxjava2:rxjava:2.1.1' compile "io.reactivex.rxjava2:rxandroid:2.0.1"//adapter compile 'com.squareup.retrofit2:adapter-rxjava2:2.2.0'// Retrofit支持scalars compile 'com.squareup.retrofit2:converter-scalars:2.0.0'
阅读全文
0 0
- Retrofit多线程下载
- MVP Retrofit多线程下载
- Retrofit+多线程下载
- Retrofit多线程断点下载
- RxJava和retrofit实现多线程下载
- 多线程下载,安装,Rxjava+okhttp+ Retrofit
- Retrofit+RxJava+Mvp实现多线程视频下载
- Retrofit多线程下载加进度条展示
- Retrofit+RXJava_多线程下载视频列表
- Retrofit下载
- Retrofit请求数据 多线程下载 Ijkplayer视频播放
- rxjava retrofit 下载
- Retrofit下载文件
- android Retrofit下载图片
- Retrofit下载文件
- retrofit下载进度
- Retrofit——下载
- Retrofit下载文件进度
- HDU2896 病毒侵袭
- C++实现控制台版五子棋(第一步)
- Linux中的数据库Mysql
- C#个人重构之修改密码
- 如何破坏单例模式?
- Retrofit多线程下载
- Atom利器-markdown图床搭建
- Leetcode-Climbing Stairs
- css3动画实现loading
- 数据库视频(第一至五章)
- 用canvas画转动的阴阳鱼
- Oracle 开启归档日志以及关闭归档日志
- 窗口2
- 搭建Hadoop开发环境