Retrofit+多线程下载
加载的网址方法
public class connect {public static final String Url = "http://169.254.51.153:8080/";}
retrofit的封装
package com.example.myretrofit.api;
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 retrofit2.http.Header;
import retrofit2.http.POST;
import retrofit2.http.Path;
import retrofit2.http.Streaming;
import rx.Observable;
public interface HomeApi {@Streaming@POST("{fileName}")Observable<ResponseBody> downloadFile(@Path("fileName") String fileName, @Header("Range") String range);@Streaming@POST("{fileName}")Observable<ResponseBody> getFilelength(@Path("fileName") String fileName);OkHttpClient client=new OkHttpClient.Builder().connectTimeout(5, TimeUnit.SECONDS).readTimeout(5,TimeUnit.SECONDS).build();Retrofit RETROFIT=new Retrofit.Builder().client(client).addConverterFactory(GsonConverterFactory.create()).addCallAdapterFactory(RxJavaCallAdapterFactory.create()).baseUrl(connect.Url).build();HomeApi requsetApi = RETROFIT.create(HomeApi.class);
}
DownloadThread
package com.example.myretrofit.net;
import android.util.Log;
import com.example.myretrofit.api.HomeApi;
import java.io.BufferedInputStream;
import java.io.File;
import java.io.IOException;
import java.io.RandomAccessFile;
import okhttp3.ResponseBody;
import rx.Observer;
import rx.schedulers.Schedulers;public class DownloadThread{private String downloadUrl="";private String path;private int threadNum=5;long length;public DownloadThread(String downloadUrl, String path) {this.downloadUrl = downloadUrl;this.path = path;}public void show(){HomeApi.requsetApi.getFilelength(downloadUrl).observeOn(Schedulers.io()).subscribeOn(Schedulers.io()).subscribe(new Observer<ResponseBody>() {@Overridepublic void onCompleted() {}@Overridepublic void onError(Throwable throwable) {Log.i("-----onError-------", "onError: "+throwable.getMessage());}@Overridepublic void onNext(ResponseBody responseBody) {length=responseBody.contentLength();downoadTask(length);}});}public void downoadTask(Long length){final File file=new File(path);if(!file.exists()){try {file.createNewFile();} catch (IOException e) {e.printStackTrace();}}DialogUrils.MAX_SIZE=length;Log.i("------length-------", "downoadTask: "+length);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);}String range="bytes="+startposition+"-"+(startposition+blockSize-1);Log.i("------range-------", "downoadTask: "+range);HomeApi.requsetApi.downloadFile(downloadUrl,range).subscribeOn(Schedulers.io()).observeOn(Schedulers.io()).subscribe(new Observer<ResponseBody>() {@Overridepublic void onCompleted() {}@Overridepublic void onError(Throwable throwable) {Log.i("-----error-----", "onResponse: "+throwable.getMessage());}@Overridepublic void onNext(ResponseBody responseBody) {try {Log.i("-----error-----", "onResponse: "+"进来了");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);if(DialogUrils.PROGRESS<0){DialogUrils.PROGRESS=0;}DialogUrils.PROGRESS+=len;Log.i(Thread.currentThread() + "-----len-----", "onResponse: "+ startposition + len);}} catch (Exception e) {e.printStackTrace();}}});}}
}
DialogUrils
package com.example.myretrofit.net;import android.app.AlertDialog;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.os.AsyncTask;
import android.os.SystemClock;public class DialogUrils {public static long MAX_SIZE=0;public static long PROGRESS=-2;public static void showUpdateDialog(final Context context){new AlertDialog.Builder(context).setTitle("更新吧").setNegativeButton("就不",null).setPositiveButton("好吧", new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {DownloadThread downloadThread=new DownloadThread("马丁·路德·金:我有一个梦想.mp4",context.getCacheDir()+"/haha.mp4");downloadThread.show();showProgress(context);}}).show();}public static void showProgress(Context context){final ProgressDialog pd=new ProgressDialog(context);pd.setTitle("正在更新");pd.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);pd.setMax(100);pd.show();new AsyncTask<String,Integer,String>(){@Overrideprotected String doInBackground(String... params) {while (PROGRESS+1<MAX_SIZE){SystemClock.sleep(10);if(MAX_SIZE>0){publishProgress((int)(PROGRESS*100/MAX_SIZE));}}return null;}@Overrideprotected void onProgressUpdate(Integer... values) {super.onProgressUpdate(values);pd.setProgress(values[0]);}}.execute();}
}
MainActivity
一个是下载sd卡,一是从路径里直接取出来
package com.example.myretrofit;import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.widget.VideoView;public class MainActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);// DialogUrils.showUpdateDialog(this);show();}private void show() {VideoView vv= (VideoView) findViewById(R.id.vv);vv.setVideoPath(MainActivity.this.getCacheDir()+"/haha.mp4");vv.start();}
}
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"android:layout_height="match_parent" tools:context="com.example.myretrofit.MainActivity"><VideoView
android:id="@+id/vv"android:layout_width="400dp"android:layout_height="300dp" /></RelativeLayout>
Retrofit+多线程下载相关推荐
- libcurl使用多线程下载大文件源码示例!
使用libcurl多线程下载大文件的基本思想: 首选打开文件,将文件等分为指定的片段,使用http range下载,一个线程下载一个片段,当线程下载片段时,它们将数据写到打开文件的指定位置,类似BT文 ...
- [Mac] mac linux 多线程下载利器 axel
> 之前做过一些文件下载的统计,发现谷歌浏览器chrome和火狐firefox, 一般都是单线程的下载文件,360浏览器却是多线程的下载. 如今切换到了mac上,发现没有360哪个浏览器,就像 ...
- 基于流式的md5计算-多线程下载工具Lwget介绍
在数据传输的时候,我们希望实现以下目标: 1. 使用多线程传输,加速下载速度 2. 数据在传输过程中,进行流式md5计算,避免在传输完毕之后校验大文件 3. 支持断点续传 4. 支持http协议和ft ...
- 断点续传---多线程下载进阶(一)
打算总结7篇笔记.来学习下断点续传---多线程下载进阶 AndroidManifest.xml <?xml version="1.0" encoding="utf- ...
- Android -- 多线程下载
因为Android应用程序是java写的,基本上很多java写的程序都可以直接照搬到Android上面,移植性非常Good.这里讲一下多线程下载,就是每个线程都下载自己的那部分,那么就需要平均分配分割 ...
- Android 多线程下载 显示进度 速度
功能要求:从网络下载一APK应用,显示下载速度.进度,并安装应用. 运行效果图: 工程结构图: 很简单,就一个activity,一个更新UI的线程,一个下载线程加个文件处理类 主要代码: /***多线 ...
- 多线程下载问题(IDHTTP)
小弟写了一个多线程下载的程序,总是有死循环的迹象,不过我认为可能是产生了死锁.可是当单步跟踪的时候产生错误大家帮小弟看看啊: unit IndyMThread; ...
- android 多线程下载,断点续传,线程池
android 多线程下载,断点续传,线程池 你可以在这里看到这个demo的源码: https://github.com/onlynight/MultiThreadDownloader 效果图 这张效 ...
- python代码示例下载-Python实现多线程下载脚本的示例代码
0x01 分析 一个简单的多线程下载资源的Python脚本,主要实现部分包含两个类: Download类:包含download()和get_complete_rate()两种方法.download() ...
最新文章
- 机器学习笔记八:常见“距离”归纳
- mybatis 需要注意的点 MyBatis 插入空值时,需要指定JdbcType (201
- InfoPath发布要点
- 如何检查Socket是否断开
- java中的字符串相关知识整理
- WebUserControl归纳
- ps中对齐,历史记录,图层
- C#通用权限管理-程序安全检查,这些你一定要考虑到位
- Requests接口测试(五)
- idea 自动生成mybaits_如何让idea自动创建mybatis配置文件?
- mac 下tomcat 9.0+eclipse+mysql8.0.12配置相关问题
- 十行代码训练sklearn七种分类算法
- 计算机excel素材,excel操作练习题素材.doc
- 遗传算法python简单示例
- csdn切换格式markdown
- oracle lookup函数,LOOKUP函数用法全解(上)——LOOKUP函数的5种用法
- 笔记本电脑上html怎样运行,手提电脑如何进入BIOS|笔记本电脑进入BIOS按哪个键...
- 树莓派chromium浏览器 kiosk 全屏提示错误
- Python 弹出提示框
- UAT 深入指南(用户验收测试)