一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達(dá)式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務(wù)器之家 - 編程語言 - Java教程 - RxJava2.x+ReTrofit2.x多線程下載文件的示例代碼

RxJava2.x+ReTrofit2.x多線程下載文件的示例代碼

2021-01-05 11:10ready_z Java教程

本篇文章主要介紹了RxJava2.x+ReTrofit2.x多線程下載文件的示例代碼,具有一定的參考價(jià)值,有興趣的可以了解一下

寫在前面:

接到公司需求:要做一個(gè)apk升級的功能,原理其實(shí)很簡單,百度也一大堆例子,可大部分都是用框架,要么就是HttpURLConnection,實(shí)在是不想這么干。正好看了兩天的RxJava2.x+ReTrofit2.x,據(jù)說這倆框架是目前最火的異步請求框架了。固本文使用RxJava2.x+ReTrofit2.x實(shí)現(xiàn)多線程下載文件的功能。
如果對RxJava2.x+ReTrofit2.x不太了解的請先去看相關(guān)的文檔。
大神至此請無視。

思路分析:

思路及其簡潔明了,主要分為以下四步

1.獲取服務(wù)器文件大小.
2.根據(jù)文件大小規(guī)劃線程數(shù)量.
3.根據(jù)下載內(nèi)容合并為完整文件.
4.調(diào)用安裝,安裝apk.
功能實(shí)現(xiàn)

來,接下來是你們最喜歡的擼代碼環(huán)節(jié)

1.首先看引用

?
1
2
3
4
5
6
7
compile 'io.reactivex:rxjava:latest.release'
compile 'io.reactivex:rxandroid:latest.release'
//network - squareup
compile 'com.squareup.retrofit2:retrofit:latest.release'
compile 'com.squareup.retrofit2:adapter-rxjava:latest.release'
compile 'com.squareup.okhttp3:okhttp:latest.release'
compile 'com.squareup.okhttp3:logging-interceptor:latest.release'

2.構(gòu)造一個(gè)下載接口DownloadService.class

?
1
2
3
4
5
6
7
public interface DownloadService {
  @Streaming
  @GET
  //downParam下載參數(shù),傳下載區(qū)間使用
  //url 下載鏈接
  Observable<ResponseBody> download(@Header("RANGE") String downParam,@Url String url);
}

3.為了使用方便封裝了一個(gè)RetrofitHelper.class,主要用于:

a)實(shí)例化OkHttpClient和Retrofit.

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public RetrofitHelper(String url, DownloadProgressListener listener) {
 
  DownloadProgressInterceptor interceptor = new DownloadProgressInterceptor(listener);
 
  OkHttpClient client = new OkHttpClient.Builder()
      .addInterceptor(interceptor)
      .retryOnConnectionFailure(true)
      .connectTimeout(DEFAULT_TIMEOUT, TimeUnit.SECONDS)
      .build();
  retrofit = new Retrofit.Builder()
      .baseUrl(url)
      .client(client)
      .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
      .build();
}

b)封裝下載方法,本次下載我使用的是三個(gè)下載線程,并沒有動態(tài)分配,各位可以根據(jù)自己的需求去動態(tài)分配線程個(gè)數(shù)

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
public Observable download(@NonNull final long start, @NonNull final long end, @NonNull final String url, final File file, final Subscriber subscriber) {
   String str = "";
   if (end == -1) {
     str = "";
   } else {
     str = end + "";
   }
   return retrofit.create(DownloadService.class).download("bytes=" + start + "-" + str, url).subscribeOn(Schedulers.io()).unsubscribeOn(Schedulers.io()).map(new Func1<ResponseBody, ResponseBody>() {
     @Override
     public ResponseBody call(ResponseBody responseBody) {
       return responseBody;
     }
   }).observeOn(Schedulers.computation()).doOnNext(new Action1<ResponseBody>() {
     @Override
     public void call(ResponseBody responseBody) {
       //第一次請求全部文件長度
       if (end == -1) {
         try {
           RandomAccessFile randomFile = new RandomAccessFile(file, "rw");
           randomFile.setLength(responseBody.contentLength());
           long one = responseBody.contentLength() / 3;
           download(0, one, url, file, subscriber).mergeWith(download(one, one * 2, url, file, subscriber)).mergeWith(download(one * 2, responseBody.contentLength(), url, file, subscriber)).subscribe(subscriber);
 
         } catch (IOException e) {
           e.printStackTrace();
         }
       } else {
         FileUtils fileUtils = new FileUtils();
         fileUtils.writeFile(start, end, responseBody.byteStream(), file);
       }
 
     }
   }).subscribeOn(AndroidSchedulers.mainThread());
 }

 4.調(diào)用下載

注:調(diào)用下載在MainAcitivity中進(jìn)行,為了直觀我們封裝了進(jìn)度攔截器以方便實(shí)現(xiàn)進(jìn)度顯示,但是本篇不在敘述進(jìn)度攔截器的實(shí)現(xiàn)過程,如有需要可以留言。

a)實(shí)現(xiàn)監(jiān)聽對象

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
subscriber = new Subscriber() {
      @Override
      public void onCompleted() {
        Log.e("MainActivity", "onCompleted下下載完成");
//        Toast.makeText(MainActivity.this, "onCompleted下下載完成", Toast.LENGTH_LONG).show();
        installAPK("mnt/sdcard/aaaaaaaaa.apk");
      }
 
      @Override
      public void onError(Throwable e) {
        e.printStackTrace();
        Log.e("MainActivity", "onError: " + e.getMessage());
      }
 
      @Override
      public void onNext(Object o) {
 
      }
    };

 b)調(diào)用封裝的RetrofitHelper實(shí)現(xiàn)下載

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
RetrofitHelper RetrofitHelper = new RetrofitHelper("http://gdown.baidu.com/data/wisegame/0904344dee4a2d92/", new DownloadProgressListener() {
     @Override
     public void update(long bytesRead, long contentLength, boolean done) {
 
       SharedPF.getSharder().setLong("update", bytesRead);
       pro.setProgress((int) ((double) bytesRead / contentLength * 100));
       temp++;
       if (temp <= 1) {
         Log.e("MainActivity", "update" + bytesRead + "");
       }
     }
   });
   RetrofitHelper.download(0, -1, "QQ_718.apk", new File("mnt/sdcard/", "aaaaaaaaa.apk"), subscriber).subscribe(new Subscriber() {
     @Override
     public void onCompleted() {
 
     }
 
     @Override
     public void onError(Throwable e) {
 
     }
 
     @Override
     public void onNext(Object o) {
 
     }
   });
 
 }

 注:最后貼一個(gè)apk安裝的方法

?
1
2
3
4
5
6
7
8
9
// 安裝APK
public void installAPK(String filePath) {
  Intent intent = new Intent();
  intent.setAction("android.intent.action.VIEW");
  intent.addCategory("android.intent.category.DEFAULT");
  intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);// 廣播里面操作需要加上這句,存在于一個(gè)獨(dú)立的棧里
  intent.setDataAndType(Uri.fromFile(new File(filePath)), "application/vnd.android.package-archive");
  mainActivity.startActivity(intent);
}

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持服務(wù)器之家。

原文鏈接:http://blog.csdn.net/w525721508/article/details/77992988

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 欧美大美bbb和大白屁股 | 免费看成人毛片日本久久 | 91小视频在线观看免费版高清 | 男女做受快插大片 | 91国内在线国内在线播放 | 日韩毛片免费在线观看 | chinese男同志同性twink | 免费成年网| 久久99视热频国只有精品 | lilisha李丽莎喷水大胆在线 | 情乱奶水欲 | 青青草在线播放 | 欧美va天堂va视频va在线 | 国产在线观看网站 | 日韩国产欧美视频 | 好大好硬好湿好紧h | 亚洲国产成人在线视频 | 国产日产精品久久久久快鸭 | 女bbwxxxx非洲黑人 | 久久99精国产一区二区三区四区 | 男人的j插入女人的p | 好看的亚洲视频 | 性伴交换多p | 超h 超重口 高h 污肉1v1 | 国产亚洲欧美一区二区三区 | 日韩成人在线影院 | 日韩人成免费网站大片 | bt伙计最新合集 | 高清不卡免费一区二区三区 | 国产免费一区不卡在线 | 国产网站免费看 | 视频在线观看入口一二三2021 | 天天爱综合| 欧美成人禁片在线观看俄罗斯 | 穆挂英风流艳史小说 | 日韩欧美中文字幕一区二区三区 | 日韩手机在线视频 | 成人精品视频 成人影院 | 亚洲欧美日韩另类在线一 | 国产伦码精品一区二区三区 | 国产精品成人自拍 |