加载的网址方法

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+多线程下载相关推荐

  1. libcurl使用多线程下载大文件源码示例!

    使用libcurl多线程下载大文件的基本思想: 首选打开文件,将文件等分为指定的片段,使用http range下载,一个线程下载一个片段,当线程下载片段时,它们将数据写到打开文件的指定位置,类似BT文 ...

  2. [Mac] mac linux 多线程下载利器 axel

    ​> 之前做过一些文件下载的统计,发现谷歌浏览器chrome和火狐firefox, 一般都是单线程的下载文件,360浏览器却是多线程的下载. 如今切换到了mac上,发现没有360哪个浏览器,就像 ...

  3. 基于流式的md5计算-多线程下载工具Lwget介绍

    在数据传输的时候,我们希望实现以下目标: 1. 使用多线程传输,加速下载速度 2. 数据在传输过程中,进行流式md5计算,避免在传输完毕之后校验大文件 3. 支持断点续传 4. 支持http协议和ft ...

  4. 断点续传---多线程下载进阶(一)

    打算总结7篇笔记.来学习下断点续传---多线程下载进阶 AndroidManifest.xml <?xml version="1.0" encoding="utf- ...

  5. Android -- 多线程下载

    因为Android应用程序是java写的,基本上很多java写的程序都可以直接照搬到Android上面,移植性非常Good.这里讲一下多线程下载,就是每个线程都下载自己的那部分,那么就需要平均分配分割 ...

  6. Android 多线程下载 显示进度 速度

    功能要求:从网络下载一APK应用,显示下载速度.进度,并安装应用. 运行效果图: 工程结构图: 很简单,就一个activity,一个更新UI的线程,一个下载线程加个文件处理类 主要代码: /***多线 ...

  7. 多线程下载问题(IDHTTP)

    小弟写了一个多线程下载的程序,总是有死循环的迹象,不过我认为可能是产生了死锁.可是当单步跟踪的时候产生错误大家帮小弟看看啊:             unit   IndyMThread;       ...

  8. android 多线程下载,断点续传,线程池

    android 多线程下载,断点续传,线程池 你可以在这里看到这个demo的源码: https://github.com/onlynight/MultiThreadDownloader 效果图 这张效 ...

  9. python代码示例下载-Python实现多线程下载脚本的示例代码

    0x01 分析 一个简单的多线程下载资源的Python脚本,主要实现部分包含两个类: Download类:包含download()和get_complete_rate()两种方法.download() ...

最新文章

  1. 机器学习笔记八:常见“距离”归纳
  2. mybatis 需要注意的点 MyBatis 插入空值时,需要指定JdbcType (201
  3. InfoPath发布要点
  4. 如何检查Socket是否断开
  5. java中的字符串相关知识整理
  6. WebUserControl归纳
  7. ps中对齐,历史记录,图层
  8. C#通用权限管理-程序安全检查,这些你一定要考虑到位
  9. Requests接口测试(五)
  10. idea 自动生成mybaits_如何让idea自动创建mybatis配置文件?
  11. mac 下tomcat 9.0+eclipse+mysql8.0.12配置相关问题
  12. 十行代码训练sklearn七种分类算法
  13. 计算机excel素材,excel操作练习题素材.doc
  14. 遗传算法python简单示例
  15. csdn切换格式markdown
  16. oracle lookup函数,LOOKUP函数用法全解(上)——LOOKUP函数的5种用法
  17. 笔记本电脑上html怎样运行,手提电脑如何进入BIOS|笔记本电脑进入BIOS按哪个键...
  18. 树莓派chromium浏览器 kiosk 全屏提示错误
  19. Python 弹出提示框
  20. UAT 深入指南(用户验收测试)

热门文章

  1. pandas应用之pivot函数
  2. 使用串口调试助手配置ESP8266模块
  3. git rebase合并提交攻略
  4. cocos creator 调节音量大小
  5. 长周期行业-航运(1)-波罗的海指数高峰历史
  6. golang实现判断链表是否有环
  7. 鸿蒙文化博物馆,江苏灌南文化博物馆开展送文化送展览进乡镇活动
  8. mysql中的三目运算
  9. JVM命令行监控工具之jhat(Java Heap Analysis Tool)
  10. 厉害了!用“Pandas”现在也可以绘制交互式的图形了!