2017-10-23 7 views
0

jsonをTransfer-Encoding:chunkedで返すサーバーからエンドポイントをストリーミングする必要があります。2チャンク付きのストリーミングサーバー

私は以下のコードを持っていますが、私はその応答を読むことができません。私はresponseBody.streamBytes()を試して、入力ストリームをStringに変換しましたが、メインスレッドでそれを行うことはできません。どうすればその回答を読むことができますか?

@Streaming 
@GET("stream/status") 
Observable<ResponseBody> streamStatus(); 

Observable<ResponseBody> observable = ApiClientHelper.getClient().streamStatus(); 
    observable 
      .subscribeOn(Schedulers.io()) 
      .observeOn(AndroidSchedulers.mainThread()) 
      .subscribe(new Observer<ResponseBody>() { 
       @Override 
       public void onSubscribe(Disposable d) { 
       } 

       @Override 
       public void onNext(final ResponseBody responseBody) { 
        //DON'T KNOW HOW TO READ DATA 
       } 

       @Override 
       public void onError(Throwable e) { 
       } 

       @Override 
       public void onComplete() { 
       } 
      }); 

EDIT:カールを使用

サーバの応答:@Streaming注釈原因を追加

* Trying 192.168.1.3... 
* TCP_NODELAY set 
* Connected to 192.168.1.3 (192.168.1.3) port 80 (#0) 
> GET /stream/meter HTTP/1.1 
> Host: 192.168.1.3 
> User-Agent: curl/7.54.0 
> Accept: */* 
> Cookie:sessionId=bf2533346190e1c72b532b9d6ec6a405 
> 
< HTTP/1.1 200 OK 
< Content-Type: text/event-stream 
< Cache-Control: no-cache, no-store 
< Date: Tue, 17 Oct 2017 12:02:03 GMT 
< Transfer-Encoding: chunked 
< Connection: Keep-Alive 
< 
data: {"production":{"ph-a":{"p":-0.817,"q":0.0,"s":47.302,"v":225.697,"i":0.21,"pf":0.0,"f":50.0},"ph-b":{"p":-0.066,"q":-0.0,"s":0.643,"v":3.091,"i":0.206,"pf":0.0,"f":50.0},"ph-c":{"p":-0.195,"q":-0.0,"s":0.943,"v":7.577,"i":0.123,"pf":0.0,"f":50.0}},"net-consumption":{"ph-a":{"p":-0.598,"q":0.0,"s":51.931,"v":225.606,"i":0.231,"pf":0.0,"f":50.0},"ph-b":{"p":-0.088,"q":0.0,"s":0.875,"v":4.585,"i":0.19,"pf":0.0,"f":50.0},"ph-c":{"p":-0.043,"q":0.0,"s":0.16,"v":1.23,"i":0.13,"pf":-1.0,"f":50.0}},"total-consumption":{"ph-a":{"p":-1.415,"q":-0.0,"s":-4.599,"v":225.652,"i":-0.02,"pf":-1.0,"f":50.0},"ph-b":{"p":-0.154,"q":0.0,"s":0.06,"v":3.838,"i":0.016,"pf":-1.0,"f":50.0},"ph-c":{"p":-0.237,"q":0.0,"s":-0.033,"v":4.404,"i":-0.008,"pf":-1.0,"f":50.0}}} 
+0

これは推測ですが、私はhttpの専門家ではありませんが、RetrfoitはHTTPクライアントではないと思います。あなたの応答として、あなたはすでに個々のチャンクではなく、ダウンロードされたオブジェクト全体を取得している可能性があります。チャンクの処理はおそらくOkHTTPのレベルのどこかで行われます。 – Lukasz

+0

わかりません。私のコードを見てください、私はonNextメソッドのresponsebodyを持っています。 – Yamila

答えて

1

メモリにファイル全体を移動しないように改造ではなく、すぐに受信バイトを渡します。これにより、利用可能な合計メモリよりも大きいデータストリームを処理することができます。しかし、あなたがメインスレッドでこれをやろうとすると、android.os.NetworkOnMainThreadExceptionが得られます。これはあなたが得たものです。したがって、問題は.observeOn(AndroidSchedulers.mainThread)にあります。

編集: 公正な警告。私はこれを実行していない。

observable 
      .subscribeOn(Schedulers.io()) 
      .observeOn(Schedulers.io()) 
      .subscribe(new Observer<ResponseBody>() { 
       @Override 
       public void onSubscribe(Disposable disposable) { 

       } 

       @Override 
       public void onNext(ResponseBody responseBody) { 
        InputStream inputStream = responseBody.byteStream(); 
        BufferedReader br = null; 
        StringBuilder sb = new StringBuilder(); 

        String line; 
        try { 

         br = new BufferedReader(new InputStreamReader(inputStream)); 
         while (br.ready()) { 
          line = br.readLine(); 
          sb.append(line); 
         } 

        } catch (IOException e) { 
         e.printStackTrace(); 
        } finally { 
         if (br != null) { 
          try { 
           br.close(); 
          } catch (IOException e) { 
           e.printStackTrace(); 
          } 
         } 
        } 

        Log.d("streamed string", sb.toString()); // replace log with whatever you want to do with it. 
       } 

       @Override 
       public void onError(Throwable throwable) { 

       } 

       @Override 
       public void onComplete() { 

       } 
      }); 
+0

いくつかのコードを投稿してもらえますか? – Yamila

+0

@ Yamila動作しましたか?私はそれをデバッグしようとすると – Lukasz

+0

、それはで立ち往生:StringBuilder sb = new StringBuilder();それをデバッグせずにRunをクリックすると、何もログに記録されません – Yamila

関連する問題