最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時(shí)間:2017年09月18日 14:16:19   作者:ready_z  
本篇文章主要介紹了RxJava2.x+ReTrofit2.x多線程下載文件的示例代碼,具有一定的參考價(jià)值,有興趣的可以了解一下

寫在前面:

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

思路分析:

思路及其簡(jiǎn)潔明了,主要分為以下四步

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

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

1.首先看引用

  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

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.

  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è)下載線程,并沒有動(dòng)態(tài)分配,各位可以根據(jù)自己的需求去動(dòng)態(tài)分配線程個(gè)數(shù)

 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) {
        //第一次請(qǐng)求全部文件長(zhǎng)度
        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)聽對(duì)象

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)下載

 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安裝的方法

  // 安裝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);
  }

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Spring引入外部屬性文件配置數(shù)據(jù)庫連接的步驟詳解

    Spring引入外部屬性文件配置數(shù)據(jù)庫連接的步驟詳解

    這篇文章主要介紹了Spring引入外部屬性文件配置數(shù)據(jù)庫連接的步驟詳解,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-01-01
  • 看過就懂的java零拷貝及實(shí)現(xiàn)方式詳解

    看過就懂的java零拷貝及實(shí)現(xiàn)方式詳解

    這篇文章主要為大家詳細(xì)的介紹了什么是零拷貝,傳統(tǒng)的IO執(zhí)行流程,零拷貝相關(guān)的知識(shí)點(diǎn)回顧,零拷貝實(shí)現(xiàn)的幾種方式及java提供的零拷貝方式相關(guān)內(nèi)容,有需要的朋友可以借鑒參考下
    2022-01-01
  • SpringBoot?實(shí)現(xiàn)流控的操作方法

    SpringBoot?實(shí)現(xiàn)流控的操作方法

    本文介紹了限流算法的基本概念和常見的限流算法,包括計(jì)數(shù)器算法、漏桶算法和令牌桶算法,還介紹了如何在Spring?Boot中使用Guava庫和自定義注解以及AOP實(shí)現(xiàn)接口限流功能,感興趣的朋友一起看看吧
    2024-12-12
  • Java中值類型和引用類型的比較與問題解決

    Java中值類型和引用類型的比較與問題解決

    這篇文章主要給大家介紹了關(guān)于Java中值類型和引用類型的比較與問題解決方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Java具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-12-12
  • Java ==,equals()與hashcode()的使用

    Java ==,equals()與hashcode()的使用

    本文主要介紹了Java ==,equals()與hashcode()的使用,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-05-05
  • 詳解java迭代器模式

    詳解java迭代器模式

    這篇文章主要介紹了java迭代器模式,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-05-05
  • idea中的update?project按鈕使用

    idea中的update?project按鈕使用

    這篇文章主要介紹了idea中的update?project按鈕使用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-05-05
  • 詳解static 和 final 和 static final區(qū)別

    詳解static 和 final 和 static final區(qū)別

    這篇文章主要介紹了static 和 final 和 static final區(qū)別,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • SpringCloud?Gateway詳細(xì)分析實(shí)現(xiàn)負(fù)載均衡與熔斷和限流

    SpringCloud?Gateway詳細(xì)分析實(shí)現(xiàn)負(fù)載均衡與熔斷和限流

    這篇文章主要介紹了SpringCloud?Gateway實(shí)現(xiàn)路由轉(zhuǎn)發(fā),負(fù)載均衡,熔斷和限流,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-07-07
  • java 實(shí)現(xiàn)截取字符串并按字節(jié)分別輸出實(shí)例代碼

    java 實(shí)現(xiàn)截取字符串并按字節(jié)分別輸出實(shí)例代碼

    這篇文章主要介紹了java 實(shí)現(xiàn)截取字符串并按字節(jié)分別輸出實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下
    2017-03-03

最新評(píng)論

云霄县| 建始县| 莱州市| 公安县| 连云港市| 平乡县| 德安县| 那坡县| 松溪县| 宜丰县| 罗江县| 大同县| 南安市| 内江市| 且末县| 喀喇沁旗| 兰考县| 蒲江县| 沐川县| 延津县| 茶陵县| 旬邑县| 弥渡县| 兴义市| 名山县| 巫山县| 高邑县| 行唐县| 项城市| 含山县| 凌海市| 东乌| 兴海县| 云南省| 富阳市| 红原县| 靖州| 宜川县| 耒阳市| 两当县| 汤阴县|