Android OkHttp+RxJava史上最も優雅なファイルアップロード/ダウンロード進捗の傍受を実現
36296 ワード
本文はすでに「劉望舒」微信公衆号の独占オリジナル発表を授権した.
前言
本文は直接RxHttpライブラリを使ってファイルのアップロード、ダウンロード、ブレークポイントのダウンロード、進度の傍受を実現して、RxHttpに対して多すぎる説明をしないで、もしRxHttpに対して理解しないならば、移動してください
RxHttpはチェーン送信要求、次世代Http要求神器(一)
RxHttpチェーン送信要求の強力なデータ解析機能(二)
RxHttpチェーン送信要求の強力なParamクラス(3)
RxHttp 1本のチェーン送信要求の注釈プロセッサGenerated API(4)
この記事の目的は、RxHttpライブラリをより多くの読者に知ってもらうことです.上記の4つの記事を読んでいる場合は、この記事を直接スキップして、サポートに感謝します.???
アップロード
進捗アップロード
ダウンロード
マルチタスクダウンロードでは、RxJavaの
マルチタスクダウンロードと同様に、説明しません.
小結
では、ファイルのアップロード、ダウンロードについてはここまで紹介します.ここまで来ると、アップロードにしてもダウンロードにしても、進捗の傍受は極めて似ており、学習コストを大幅に削減していることがわかります.どうですか.優雅ではないでしょうか.顔を殴ってください.
最后に、多くの功労はすべてRxJavaの强大さのおかげで、RxJavaに感谢して、それに敬意を表します!!!
次の文では、RxJavaの強力なオペレータを使用して、RxHttpとどのような火花を消すことができるかを見てみましょう.転載は出典を明記してください.ありがとうございます.
前言
本文は直接RxHttpライブラリを使ってファイルのアップロード、ダウンロード、ブレークポイントのダウンロード、進度の傍受を実現して、RxHttpに対して多すぎる説明をしないで、もしRxHttpに対して理解しないならば、移動してください
RxHttpはチェーン送信要求、次世代Http要求神器(一)
RxHttpチェーン送信要求の強力なデータ解析機能(二)
RxHttpチェーン送信要求の強力なParamクラス(3)
RxHttp 1本のチェーン送信要求の注釈プロセッサGenerated API(4)
この記事の目的は、RxHttpライブラリをより多くの読者に知ってもらうことです.上記の4つの記事を読んでいる場合は、この記事を直接スキップして、サポートに感謝します.???
アップロード
RxHttp.postForm("http://...") // Form Post
.add("key", "value")
.add("file1", new File("xxx/1.png")) // file
.add("file2", new File("xxx/2.png"))
.asString() //asXXX ,
.as(RxLife.asOnMain(this)) // ,
.subscribe(s -> {
// , Http , String
}, throwable -> {
//
});
:
Httpの戻り値を解析する必要がある場合は、asParser
オペレータを使用すると、解析器Parser
に入力できます.進捗アップロード
asUpload(Progress,Scheduler)
オペレータを使用 RxHttp.postForm("http://www.......") // Form Post
.add("key1", "value1")// ,
.add("file1", new File("xxx/1.png"))
.asUpload(progress -> {
// ,0-100, , 101 , Http
int currentProgress = progress.getProgress(); // 0-100
long currentSize = progress.getCurrentSize(); //
long totalSize = progress.getTotalSize(); //
}, AndroidSchedulers.mainThread())//
.as(RxLife.as(this)) //
.subscribe(s -> { //s String , SimpleParser
// ,
}, throwable -> {
// ,
});
:
Httpの戻り値を解析する必要がある場合は、asUpload(Parser,Progress,Scheduler)
メソッドを使用して、解析器Parser
に転送できます.ダウンロード
//
String destPath = getExternalCacheDir() + "/" + System.currentTimeMillis() + ".apk";
RxHttp.get("http://update.9158.com/miaolive/Miaolive.apk")
.asDownload(destPath) // asDownload ,
.as(RxLife.asOnMain(this)) // ,
.subscribe(s -> {
// ,
}, throwable -> {
//
});
ダウンロードの進行状況
asDownload(String,Consumer,Scheduler)
メソッドを使用 //
String destPath = getExternalCacheDir() + "/" + System.currentTimeMillis() + ".apk";
RxHttp.get("http://update.9158.com/miaolive/Miaolive.apk")
.asDownload(destPath, progress -> {
// ,0-100, , 101 ,
int currentProgress = progress.getProgress(); // 0-100
long currentSize = progress.getCurrentSize(); //
long totalSize = progress.getTotalSize(); //
}, AndroidSchedulers.mainThread()) //
.as(RxLife.as(this)) //
.subscribe(s -> {//s String ,
// ,
}, throwable -> {
// ,
});
ブレークポイントのダウンロード
は
と比較して、setRangeHeader
メソッドの着信開始および終了位置を呼び出すだけでよい(終了位置はファイルの末尾を黙認しない)が、他には何の差もない String destPath = getExternalCacheDir() + "/" + "Miaobo.apk";
long length = new File(destPath).length(); //
RxHttp.get("http://update.9158.com/miaolive/Miaolive.apk")
.setRangeHeader(length) // ,
.asDownload(destPath)
.as(RxLife.asOnMain(this)) //
.subscribe(s -> { //s String
Log.e("LJX", "breakpointDownloadAndProgress=" + s);
// ,
}, throwable -> {
// ,
});
進捗ブレークポイント付きダウンロード
は、
と比較して、setRangeHeader
メソッドの着信開始および終了位置を呼び出すだけでよい(終了位置はファイルの末尾として黙認されない)、その他には何の差もない String destPath = getExternalCacheDir() + "/" + "Miaobo.apk";
long length = new File(destPath).length(); //
RxHttp.get("http://update.9158.com/miaolive/Miaolive.apk")
.setRangeHeader(length) // ,
.asDownload(destPath, progress -> {
// ,0-100,
int currentProgress = progress.getProgress(); // 0-100
long currentSize = progress.getCurrentSize(); //
long totalSize = progress.getTotalSize(); //
}, AndroidSchedulers.mainThread()) //
.as(RxLife.as(this)) //
.subscribe(s -> { //s String
// ,
}, throwable -> {
// ,
});
:
上の進捗ブレークポイント付きダウンロードでは、戻る進捗は0から開始され、前回ダウンロードの進捗を接続する必要がある場合は、asDownload(String,long,Consumer,Scheduler)
メソッドを呼び出して、前回ダウンロードした長さ(2番目のパラメータ)を次のように入力します. String destPath = getExternalCacheDir() + "/" + "Miaobo.apk";
long length = new File(destPath).length(); //
RxHttp.get("http://update.9158.com/miaolive/Miaolive.apk")
.setRangeHeader(length) // ,
.asDownload(destPath, length, progress -> {
// ,0-100,
int currentProgress = progress.getProgress(); // 0-100
long currentSize = progress.getCurrentSize(); //
long totalSize = progress.getTotalSize(); //
}, AndroidSchedulers.mainThread()) //
.as(RxLife.as(this)) //
.subscribe(s -> { //s String
// ,
}, throwable -> {
// ,
});
マルチタスクのダウンロードマルチタスクダウンロードでは、RxJavaの
merge
オペレータを使用できます.以下のようにします.List<Observable<String>> downList = new ArrayList<>();
for (int i = 0; i < 3; i++) {
String destPath = getExternalCacheDir() + "/" + i + ".apk";
String url = "http://update.9158.com/miaolive/Miaolive.apk"
Observable<String> down = RxHttp.get(url)
.asDownload(destPath);
downList.add(down);
}
// RxJava ,
Observable.merge(downList)
.as(RxLife.as(this))
.subscribe(s -> {
//
}, throwable -> {
//
}, () -> {
//
});
各タスクのダウンロードの進捗状況を監視したい場合は、次のように簡単です.List<Observable<String>> downList = new ArrayList<>();
for (int i = 0; i < 3; i++) {
String destPath = getExternalCacheDir() + "/" + i + ".apk";
String url = "http://update.9158.com/miaolive/Miaolive.apk"
Observable<String> down = RxHttp.get(url)
.asDownload(destPath, progress -> {
//
}, AndroidSchedulers.mainThread())
downList.add(down);
}
// RxJava ,
Observable.merge(downList)
.as(RxLife.as(this))
.subscribe(s -> {
//
}, throwable -> {
//
}, () -> {
//
});
マルチタスクアップロードマルチタスクダウンロードと同様に、説明しません.
小結
では、ファイルのアップロード、ダウンロードについてはここまで紹介します.ここまで来ると、アップロードにしてもダウンロードにしても、進捗の傍受は極めて似ており、学習コストを大幅に削減していることがわかります.どうですか.優雅ではないでしょうか.顔を殴ってください.
最后に、多くの功労はすべてRxJavaの强大さのおかげで、RxJavaに感谢して、それに敬意を表します!!!
次の文では、RxJavaの強力なオペレータを使用して、RxHttpとどのような火花を消すことができるかを見てみましょう.転載は出典を明記してください.ありがとうございます.