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!