ホームページ Java &#&チュートリアル RxJava2.x および ReTrofit2.x マルチスレッドでファイルをダウンロードする方法の例

RxJava2.x および ReTrofit2.x マルチスレッドでファイルをダウンロードする方法の例

Sep 19, 2017 am 09:52 AM
ダウンロード

この記事では主に RxJava2 のサンプル コードを紹介します。apk アップグレード機能を作成する原理は実際には非常に簡単です。Baidu にも多くの例がありますが、そのほとんどはフレームワークまたは HttpURLConnection を使用します。 。 RxJava2.x+ReTrofit2.x を 2 日間見てきました。現在、この 2 つのフレームワークが最も人気のある非同期リクエスト フレームワークであると言われています。この記事では、RxJava2.x+ReTrofit2.xを使用して、マルチスレッドのファイルダウンロード機能を実装します。

RxJava2.x+ReTrofit2.x についてよく知らない場合は、まず関連ドキュメントを読んでください。

マスター、これは無視してください。

アイデアの分析:



このアイデアは非常に簡潔かつ明確であり、主に次の 4 つのステップに分かれています

1. サーバーのファイル サイズを取得します。2. ファイル サイズに基づいてスレッド数を計画します。 .3. ダウンロードしたコンテンツを完全なファイルに結合します。

4. インストールを呼び出して、apk をインストールします。

機能が実装されました

さあ、次はお気に入りのコードのリンクです

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. ダウンロード インターフェイス DownloadService.class を構築します

public interface DownloadService {
  @Streaming
  @GET
  //downParam下载参数,传下载区间使用
  //url 下载链接
  Observable<ResponseBody> download(@Header("RANGE") String downParam,@Url String url);
}
ログイン後にコピー

3. 使いやすくするために、RetrofitHelper.class はカプセル化されており、主に次の目的で使用されます:

a) 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) ダウンロード メソッドをカプセル化し、私はこのダウンロードを使用しました。3 つのダウンロード スレッドの動的割り当てはありません。必要に応じてスレッドの数を動的に割り当てることができます

 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. ダウンロードを呼び出します

注:ダウンロードは MainActivity で実行されます。直感的に理解できるように、進行状況の表示を容易にするために進行状況インターセプターをカプセル化しました。ただし、この記事では進行状況インターセプターの実装プロセスについては説明しません。必要に応じて、メッセージを残すことができます。

a) リスニング オブジェクトを実装します


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) カプセル化された RetrofitHelper を呼び出してダウンロードを実装します

 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) {

      }
    });

  }
ログイン後にコピー

注: 最後に、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);// 广播里面操作需要加上这句,存在于一个独立的栈里
    intent.setDataAndType(Uri.fromFile(new File(filePath)), "application/vnd.android.package-archive");
    mainActivity.startActivity(intent);
  }
ログイン後にコピー

以上がRxJava2.x および ReTrofit2.x マルチスレッドでファイルをダウンロードする方法の例の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

マグネットリンクの使い方 マグネットリンクの使い方 Feb 18, 2024 am 10:02 AM

マグネット リンクは、リソースをダウンロードするためのリンク方法であり、従来のダウンロード方法よりも便利で効率的です。マグネット リンクを使用すると、中間サーバーに依存せずに、ピアツーピア方式でリソースをダウンロードできます。この記事ではマグネットリンクの使い方と注意点を紹介します。 1. マグネット リンクとは? マグネット リンクは、P2P (Peer-to-Peer) プロトコルに基づくダウンロード方式です。ユーザーはマグネット リンクを通じてリソースの発行者に直接接続し、リソースの共有とダウンロードを完了できます。従来のダウンロード方法と比較して、磁気

紅果短編ドラマのエピソードをダウンロードする方法 紅果短編ドラマのエピソードをダウンロードする方法 Mar 11, 2024 pm 09:16 PM

紅国短編劇は短編劇を鑑賞するためのプラットフォームであるだけでなく、小説やその他の刺激的なコンテンツを含む豊富なコンテンツの宝庫でもあります。これは間違いなく、読書が好きな多くのユーザーにとって大きな驚きです。ただし、多くのユーザーは、Hongguo Short Play でこれらの小説をダウンロードして視聴する方法をまだ知りません。以下では、この Web サイトの編集者が詳細なダウンロード手順を提供します。必要なすべての人に役立つことを願っています。パートナー。紅果寸劇をダウンロードして視聴するにはどうすればよいですか? 答え: [紅果寸劇] - [オーディオブック] - [記事] - [ダウンロード]。具体的な手順: 1. まず、Hongguo Short Drama ソフトウェアを開き、ホームページに入り、ページ上部の [本を聴く] ボタンをクリックします; 2. 次に、小説ページで多くの記事コンテンツが表示されます。

壁紙エンジンで別のアカウントにログインした後、他の人の壁紙をダウンロードした場合はどうすればよいですか? 壁紙エンジンで別のアカウントにログインした後、他の人の壁紙をダウンロードした場合はどうすればよいですか? Mar 19, 2024 pm 02:00 PM

自分のコンピュータで他人の Steam アカウントにログインし、その他人のアカウントに壁紙ソフトウェアがインストールされている場合、自分のアカウントに切り替えた後、Steam は他人のアカウントに登録されている壁紙を自動的にダウンロードします。 Steam クラウドの同期をオフにします。別のアカウントにログインした後に、wallpaperengine が他の人の壁紙をダウンロードした場合の対処方法 1. 自分の steam アカウントにログインし、設定でクラウド同期を見つけて、steam クラウド同期をオフにします。 2. 以前にログインしたことのある他の人の Steam アカウントにログインし、壁紙クリエイティブ ワークショップを開き、サブスクリプション コンテンツを見つけて、すべてのサブスクリプションをキャンセルします。 (将来壁紙が見つからない場合は、まず壁紙を収集してからサブスクリプションをキャンセルできます) 3. 自分の Steam に戻ります。

115://で始まるリンクをダウンロードするにはどうすればよいですか?ダウンロード方法の紹介 115://で始まるリンクをダウンロードするにはどうすればよいですか?ダウンロード方法の紹介 Mar 14, 2024 am 11:58 AM

最近、多くのユーザーから、115:// で始まるリンクをダウンロードするにはどうすればよいかという質問が編集者に寄せられました。 115:// で始まるリンクをダウンロードしたい場合は、115 ブラウザを使用する必要があります。115 ブラウザをダウンロードしたら、以下のエディタによって作成されたダウンロード チュートリアルを見てみましょう。 115:// で始まるリンクをダウンロードする方法の紹介 1. 115.com にログインし、115 ブラウザをダウンロードしてインストールします。 2. 115 ブラウザのアドレス バーに chrome://extensions/ と入力し、拡張機能センターに入り、Tampermonkey を検索して、対応するプラグインをインストールします。 3. 115 ブラウザのアドレス バーに「Grease Monkey Script: https://greasyfork.org/en/」と入力します。

123クラウドディスクからファイルをダウンロードする方法 123クラウドディスクからファイルをダウンロードする方法 Feb 23, 2024 pm 08:58 PM

123クラウドディスクは多くのファイルをダウンロードできますが、具体的にはどのようにファイルをダウンロードするのですか?ユーザーは、ダウンロードしたいファイルを選択してクリックしてダウンロードするか、ファイルを右クリックしてダウンロードを選択できます。この 123 クラウド ディスクからファイルをダウンロードする方法の紹介では、具体的なダウンロード方法を説明しますので、よく知らない友達は急いで見てください。 123 クラウド ディスクからファイルをダウンロードする方法 1. まずソフトウェアを開き、ダウンロードする必要があるソフトウェアをクリックすると、ダウンロード ボタンが表示されます。 2. または、ソフトウェアを右クリックすると、リストにダウンロード ボタンが表示されます。 3. ダウンロードウィンドウが表示されるので、ダウンロードする場所を選択します。 4. 選択した後、「ダウンロード」をクリックしてこれらのファイルをダウンロードします。

スーパーピープル ゲームのダウンロードとインストール方法の紹介 スーパーピープル ゲームのダウンロードとインストール方法の紹介 Mar 30, 2024 pm 04:01 PM

superpeople ゲームは、steam クライアントを通じてダウンロードできます。このゲームのサイズは約 28G です。ダウンロードとインストールには通常 1 時間半かかります。ここでは、具体的なダウンロードとインストールのチュートリアルを紹介します。グローバルクローズドテストへの新しい申請方法 1) Steamストア(Steamクライアントダウンロード)で「SUPERPEOPLE」を検索 2) 「SUPERPEOPLE」ストアページ下部にある「SUPERPEOPLEクローズドテストへのアクセスをリクエスト」をクリック 3) request accessボタン、Steamライブラリで「SUPERPEOPLECBT」ゲームが確認できます 4)「SUPERPEOPLECBT」内のインストールボタンをクリックしてダウンロード

動画アカウントから動画をダウンロードする方法「必見:動画アカウントから動画を保存する簡単な方法」 動画アカウントから動画をダウンロードする方法「必見:動画アカウントから動画を保存する簡単な方法」 Feb 06, 2024 pm 06:42 PM

現在、ビデオ アカウントをプレイし始めている人が増えています。ビデオ アカウントは、ビデオ アカウントを通じて日常生活を共有し、お金を稼ぐことができる短いビデオ プラットフォームでもあります。最近、WeChat ビデオ アカウントからのビデオがダウンロードされない理由を尋ねる友人を見かけました。Yang Shuaikang が試しに行ってみましたが、確かにダウンロード ボタンはなく、他の方法でビデオを抽出するしかありませんでした。今日、Yang Shuaikang は共有します愚かなメソッドを持っています、見に来てください。 WeChat ビデオ アカウントからビデオを抽出する方法 1. WeChat のコンピューター バージョンを開き、左側にある [ビデオ アカウント] を見つけます; 2. 検索を通じてダウンロードしたいビデオを見つけます; 3. 最後に、画面録画ツールを使用して、録画したビデオのサイズを指定して、最後に録画して編集するだけです。 PS: 1. この方法はコンピュータ版でのみ記録でき、携帯電話では記録できません。

Quarkネットワークディスクをローカルにダウンロードするにはどうすればよいですか? Quark Network Diskからダウンロードしたファイルをローカルコンピュータに保存する方法 Quarkネットワークディスクをローカルにダウンロードするにはどうすればよいですか? Quark Network Diskからダウンロードしたファイルをローカルコンピュータに保存する方法 Mar 13, 2024 pm 08:31 PM

多くのユーザーはQuark Network Diskを使用するときにファイルをダウンロードする必要がありますが、ファイルをローカルに保存したいので、どのように設定すればよいでしょうか?このサイトでは、Quark Network Diskからダウンロードしたファイルをローカルコンピュータに保存する方法を詳しくユーザーに紹介します。 Quarkネットワークディスクからダウンロードしたファイルをローカルコンピュータに保存する方法 1. Quarkを開き、アカウントにログインし、リストアイコンをクリックします。 2. アイコンをクリックした後、ネットワークディスクを選択します。 3. Quark Network Diskに入ったら、「My Files」をクリックします。 4. [マイ ファイル] に入ったら、ダウンロードするファイルを選択し、三点アイコンをクリックします。 5. ダウンロードしたいファイルにチェックを入れ、「ダウンロード」をクリックします。

See all articles