Retrofit+RXJava_多线程下载视频列表
来源:互联网 发布:c语言教案 编辑:程序博客网 时间:2024/06/05 04:16
BaseService:
public class BaseService { 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(RxJavaCallAdapterFactory.create()); public static <S> S createService(Class<S> serviceClass) { Retrofit retrofit = builder.client(httpClient.build()).build(); return retrofit.create(serviceClass); }}
API:
public interface RetrofitAPI { @Streaming @GET Observable<ResponseBody> download(@Header("RANGE") String start, @Url String url);}
Model接口:
public interface IDownLoadModel { void getData(String start,String url,String url2,GetCallback callback); interface GetCallback{ void GetComplete(ResponseBody responseBody); } }
Model实现类:
public class DownLoadModel implements IDownLoadModel { String url3 = ""; private static final String DOWNLOAD_INIT = "1"; private static final String DOWNLOAD_ING = "2"; private static final String DOWNLOAD_PAUSE = "3"; private String stateDownload = DOWNLOAD_INIT;//当前线程状态 private long pro; public Progress progress; @Override public void getData(String start, String url, final String url2, GetCallback callback) { this.url3 = url; BaseService.createService(RetrofitAPI.class).download(start, url3) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Observer<ResponseBody>() { @Override public void onCompleted() { } @Override public void onError(Throwable e) { } @Override public void onNext(ResponseBody responseBody) { final long l = responseBody.contentLength(); downloadTask(l, url2); } }); } public void downloadTask(final long length, String url2) { final File file = new File(url2); if (!file.exists()) { try { file.createNewFile(); } catch (IOException e) { e.printStackTrace(); } } MainActivity.MAX_SIZE = length; //例如 1000kb 3 333 int threadNum = 5; long blockSize = length / threadNum;// //四舍五入--- 让一个数字+0。5在四舍五入 就变成 向上取整 //计算出下载块以后 创建线程执行下载操作 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); BaseService.createService(RetrofitAPI.class).download(range, url3) .subscribeOn(Schedulers.io()) .observeOn(Schedulers.io()) .subscribe(new Observer<ResponseBody>() { @Override public void onCompleted() { } @Override public void onError(Throwable e) { } @Override public void onNext(ResponseBody responseBody) { BufferedInputStream bis = new BufferedInputStream(responseBody.byteStream()); RandomAccessFile raf = null; try { 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); pro += len; final int l = (int) (pro * 100 / length); handler.sendEmptyMessage(l); Log.i("=======l", "onNext: " + l); DownLoadActivity.progre = l; } } catch (Exception e) { e.printStackTrace(); } } }); } } public void setProgress(Progress progress) { this.progress = progress; } public interface Progress{ void updateProgress(int progress); } protected void onPause() { stateDownload = DOWNLOAD_PAUSE; } /** * 继续下载 */ protected void onStart() { synchronized (DOWNLOAD_PAUSE) { stateDownload = DOWNLOAD_ING; DOWNLOAD_PAUSE.notifyAll(); } } Handler handler=new Handler(){ @Override public void handleMessage(Message msg) { progress.updateProgress(msg.what); } };}
public interface IDownLoadView { void getProgress(int a); void getData(ResponseBody responseBody);}
Presenter:
public class DownLoadPresenter implements BasePresenter<IDownLoadView> { SoftReference<IDownLoadView> srf; DownLoadModel model; public DownLoadPresenter(IDownLoadView view) { model = new DownLoadModel(); attch(view); } public void down(final String start, final String url, final String url2) { model.getData(start, url, url2, new IDownLoadModel.GetCallback() { @Override public void GetComplete(ResponseBody responseBody) { srf.get().getData(responseBody); } }); model.setProgress(new DownLoadModel.Progress() { @Override public void updateProgress(int progress) { srf.get().getProgress(progress); } }); } @Override public void attch(IDownLoadView view) { srf = new SoftReference<IDownLoadView>(view); } @Override public void deatch() { srf.clear(); }}
Activity:
public class DownLoadActivity extends BaseActivity<DownLoadPresenter> implements IDownLoadView { @BindView(R.id.wb) VideoView wb; @BindView(R.id.btn) Button btn; @BindView(R.id.pro) ProgressBar pro; @BindView(R.id.tv) TextView tv; private String uri; public static long progre; private String s; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_down_load); ButterKnife.bind(this); Intent intent = getIntent(); uri = intent.getStringExtra("uri"); wb.setMediaController(new MediaController(this));// wb.setVideoURI(Uri.parse(uri)); wb.requestFocus(); btn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { s = getCacheDir() + "haha1.mp4"; presenter.down(String.valueOf(0), uri, s); } }); } @Override void createPresenter() { presenter = new DownLoadPresenter(this); } @Override public void getProgress(int a) { pro.setProgress(a); tv.setText(a+"%"); if(tv.getText().toString().equals("100%")){ Log.i("======tv", "getProgress: "+tv); wb.setVideoPath(s); wb.start(); } } @Override public void getData(ResponseBody responseBody) { }}
阅读全文
0 0
- Retrofit+RXJava_多线程下载视频列表
- Retrofit+RXJava_
- Retrofit+RxJava+Mvp实现多线程视频下载
- Retrofit请求数据 多线程下载 Ijkplayer视频播放
- Retrofit多线程下载
- MVP Retrofit多线程下载
- Retrofit+多线程下载
- Retrofit多线程断点下载
- 多线程断点续传视频列表
- 多线程下载加载视频
- 多线程下载视频
- 多线程下载+视频播放
- 多线程下载视频
- RxJava和retrofit实现多线程下载
- 多线程下载,安装,Rxjava+okhttp+ Retrofit
- Retrofit多线程下载加进度条展示
- 用多线程下载视频(Java)
- 多线程下载+断点续传+播放视频
- getMeasuredHeight()跟getHeight()区别
- Hibernate建立关系配置(hbm.xml)bag中cascade属性
- 引入三方库出现android.support.v4.animation.AnimatorCompatHelpe
- Qt之QSS(白色靓丽)【转】
- SQL语言的分类
- Retrofit+RXJava_多线程下载视频列表
- leetcode 349|350. Intersection of Two Arrays 1|2
- 我公司目前的敏捷持续部署总结和展望
- 请问owb组件是干什么的?数据库升级后这个组件的版本号不对有影响吗?
- Instruments Swift教程:开始
- QueryByExampleExecutor接口的查询
- 商品管理系统
- [Python模块学习]使用linecache模块加载和缓存文件内容
- http请求传json串或者是key=value模式