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!