Android OkHttp+RxJava史上最も優雅なファイルアップロード/ダウンロード進捗の傍受を実現

36296 ワード

本文はすでに「劉望舒」微信公衆号の独占オリジナル発表を授権した.
前言
本文は直接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とどのような火花を消すことができるかを見てみましょう.転載は出典を明記してください.ありがとうございます.