Heim  >  Artikel  >  Java  >  Beispiele für das Herunterladen von Dateien mit RxJava2.x- und ReTrofit2.x-Multithreads

Beispiele für das Herunterladen von Dateien mit RxJava2.x- und ReTrofit2.x-Multithreads

黄舟
黄舟Original
2017-09-19 09:52:142389Durchsuche

In diesem Artikel wird hauptsächlich der Beispielcode der Multithread-Downloaddatei RxJava2.x+ReTrofit2.x vorgestellt, der einen gewissen Referenzwert hat.

Schreiben Sie vor :

Ich habe eine Anfrage von der Firma erhalten, eine APK-Upgrade-Funktion zu erstellen. Das Prinzip ist eigentlich auch sehr einfach, aber die meisten davon verwenden Frameworks oder HttpURLConnection Ich möchte das nicht tun. Ich habe mir gerade zwei Tage lang RxJava2.x+ReTrofit2.x angesehen. Es wird gesagt, dass diese beiden Frameworks derzeit die beliebtesten asynchronen Anforderungsframeworks sind. In diesem Artikel wird RxJava2.x + ReTrofit2.x verwendet, um die Funktion zum Herunterladen von Dateien mit mehreren Threads zu implementieren.
Wenn Sie nicht viel über RxJava2.x+ReTrofit2.x wissen, lesen Sie bitte zuerst die relevanten Dokumente.
Meister, bitte ignorieren Sie das.

Ideenanalyse:

Die Idee ist prägnant und klar und gliedert sich hauptsächlich in die folgenden vier Schritte

1. Holen Sie sich die Serverdatei Größe.
2 .Planen Sie die Anzahl der Threads entsprechend der Dateigröße.
3. Kombinieren Sie den heruntergeladenen Inhalt zu einer vollständigen Datei.
4. Rufen Sie die Installation auf und installieren Sie die APK.
Die Funktion ist implementiert

. Als nächstes folgt Ihr aktueller Lieblingscode-Link

1. Schauen Sie sich zuerst die Referenz an


  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. Erstellen Sie eine Download-Schnittstelle DownloadService.class


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

3. Zur Benutzerfreundlichkeit ist eine RetrofitHelper.class gekapselt, die hauptsächlich für Folgendes verwendet wird:

a ) OkHttpClient instanziieren und nachrüsten.


  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) Ich habe für diesen Download drei Download-Threads verwendet, und es gibt keine dynamische Zuordnung die Anzahl der Threads entsprechend Ihren eigenen Bedürfnissen


 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. Anruf-Download

Hinweis: Der Anruf-Download wird in MainAcitivity durchgeführt Intuitiv haben wir einen Fortschritts-Interceptor gekapselt, um die Fortschrittsanzeige zu erleichtern, aber dieser Artikel wird den Implementierungsprozess des Fortschritts-Interceptors nicht beschreiben. Bitte hinterlassen Sie bei Bedarf eine Nachricht.

a) Implementieren Sie das Abhörobjekt


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) Rufen Sie den gekapselten RetrofitHelper auf, um den Download zu implementieren


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

      }
    });

  }

Hinweis: Veröffentlichen Sie abschließend eine APK-Installationsmethode


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

Das obige ist der detaillierte Inhalt vonBeispiele für das Herunterladen von Dateien mit RxJava2.x- und ReTrofit2.x-Multithreads. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn