Maison > Java > javaDidacticiel > le corps du texte

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

黄舟
Libérer: 2017-09-19 09:52:14
original
2439 Les gens l'ont consulté

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'
Copier après la connexion

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);
}
Copier après la connexion

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();
  }
Copier après la connexion

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());
  }
Copier après la connexion

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

      }
    };
Copier après la connexion

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

      }
    });

  }
Copier après la connexion

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);
  }
Copier après la connexion

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!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!