2017-06-08 5 views
3

SingleMaybeおよびObservableのいくつかの作業を実行するオブジェクトの複雑なチェーンがあるとします。例えばRxJavaグラフの実行をどのように視覚化できますか?

// Download, unzip and parse a release 
public static Single<Release> fetchRelease(final Release release) { 
    final Path cachePath = getCachePath(release); 
    return download(release.url, cachePath, true).ignoreElements() 
     .andThen(hash(cachePath)) 
     .flatMap(fileHash -> unzip(cachePath) 
      .andThen(parseFile(unzipTargetPath))); 
} 

これらの鎖は、複数のスレッド間で実行される可能性があります。

問題は、可能であれば論理を泥まませることなく、これらのタスクの進行をユーザーに表示したいということです。

例えば、上記のタスクが表示されることがあります:

+-Fetching release 1.0... Done 
    +-Downloading https://www.example.com/v1.0.0.zip 100% 
    +-Hashing Library/Caches/Example/v1.0.0.zip... Done 
    +-Unpacking Library/Caches/Example/v1.0.0.zip 
    +-src.. Done 
    +-tests... Done 
    +-resources... Done 
    +-Parsing release... Done 

理想的には、私は、タスクの階層構造を表示したいと思います。これは、現在のところJavaコールグラフでのみエンコードされています。

私の現在の考え方は次のとおりです。

  • 変更最後の要素は結果であり、他は進行状況の更新ですObservableにすべてのSingle
  • タスクの各ステージのイベントクラスを記述します。

これは、コードを読みにくくして多くのボイラープレートにつながると思います。

public final class DownloadProgress { 
    public final float progress; 
    // etc.. 
} 

// etc... 

public final class FetchReleaseProgress { 
    public final Variant<DownloadProgress, HashingProgress, UnpackProgress, ParseProgress> progress; 
    // etc... 
} 

推奨されるアプローチは何ですか?

+0

あなたはhtraceを見ることができます – raam86

+0

RxJavaPlugin –

答えて

0

あなたは正しい道の上に、あなたはあなたが興味のあるUIイベントを表し、完全なUIモデルを書くことができ、私は

+-Fetching release 1.0... Done 
    +-Downloading https://www.example.com/v1.0.0.zip 100% 
    +-Hashing Library/Caches/Example/v1.0.0.zip... Done 
    +-Unpacking Library/Caches/Example/v1.0.0.zip 
    +-src.. Done 
    +-tests... Done 
    +-resources... Done 
    +-Parsing release... Done 

とここでは例として、あなたのケースを取りますよねモデルはそのような気にいらないかもしれない:

final class DownloadUiModel { 
private float progress; 
private String hashing; 
private String downloading; 
private String unpacking; 
private String done; 

private DownloadUiModel(float progress, String hashing //..etc) { 
} 
//getters 
//setters 
} 

はその後Rxjavaで、あなたは次のように前のモデルを使用することができます:

download(release.url, cachePath, true) 
.ignoreElements() 
.map(response -> downloadUiModel.setDownloading(release.url)) 
.andThen(hash(cachePath)) 
.map(response -> downloadUiModel.setHashing(cachePath)) 
.flatMap(fileHash -> unzip(cachePath) 
.andThen(parseFile(unzipTargetPath))) 
.map(response -> downloadUiModel.setUnzipping(unzipTargetPath)) 
... 
サブスクライブするとき

はその後、あなたはとても

downloadObservable.subscribe(model -> 
if(model.getProgress()!= 100){ 
Timber.d(model.getDownloading()) 
Timber.d(model.getHashing()) 
Timber.d(model.getUnpacking)) 
//... 
} 

あなたのUIロジックリクエストロジックから区切られている。この方法についての素晴らしい部分、そしてあなたはイースリーAndroidのメインスレッドに切り替えることができますあなたのようなUI更新するには、このUIモデルを使用することができます安全に。

関連する問題