Maison  >  Article  >  Java  >  Exemples de téléchargement de fichiers avec les multithreads RxJava2.x et ReTrofit2.x

Exemples de téléchargement de fichiers avec les multithreads RxJava2.x et ReTrofit2.x

黄舟
黄舟original
2017-09-19 09:52:142390parcourir

Cet article présente principalement l'exemple de code du fichier de téléchargement multithread RxJava2.x+ReTrofit2.x, qui a une certaine valeur de référence. Ceux qui sont intéressés peuvent en apprendre davantage

Écrivez devant. :

Reçu une demande de l'entreprise : faire une fonction de mise à niveau d'apk. Le principe est en fait très simple. Baidu a aussi beaucoup d'exemples, mais la plupart d'entre eux utilisent des frameworks ou HttpURLConnection. je ne veux pas faire ça. Je viens de regarder RxJava2.x+ReTrofit2.x pendant deux jours. On dit que ces deux frameworks sont actuellement les frameworks de requêtes asynchrones les plus populaires. Cet article utilise RxJava2.x+ReTrofit2.x pour implémenter la fonction de téléchargement de fichiers multithread.
Si vous ne savez pas grand chose sur RxJava2.x+ReTrofit2.x, veuillez d'abord lire les documents pertinents.
Maître, s'il vous plaît, ignorez ceci.

Analyse de l'idée :

L'idée est concise et claire, et elle est principalement divisée en quatre étapes suivantes

1 Obtenez le fichier du serveur. size.
2 .Planifiez le nombre de threads en fonction de la taille du fichier.
3. Combinez le contenu téléchargé en un fichier complet.
4. Appelez l'installation et installez l'apk.
La fonction. est implémenté

. Ensuite est votre lien de code favori le plus récent

1. Regardez d'abord la référence


  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. Construire une interface de téléchargement DownloadService.class


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

3. Pour faciliter l'utilisation, un RetrofitHelper.class est encapsulé, principalement utilisé pour :

a. ) Instanciez OkHttpClient et 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) Méthode de téléchargement du package J'ai utilisé trois threads de téléchargement pour ce téléchargement, et il n'y a pas d'allocation dynamique. le nombre de fils de discussion en fonction de vos propres besoins


 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. Téléchargement d'appel

Remarque : le téléchargement d'appel est effectué dans MainAcitivity Par souci de. Intuition, nous avons encapsulé un intercepteur de progression pour faciliter l'affichage de la progression, mais cet article ne le décrira pas. Le processus de mise en œuvre de l'intercepteur de progression, veuillez laisser un message si nécessaire.

a) Implémentez l'objet d'écoute


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) Appelez le RetrofitHelper encapsulé pour implémenter le téléchargement


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

      }
    });

  }

Remarque : Enfin, publiez une méthode d'installation de l'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);
  }

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn