2017-10-23 16 views
0

json을 Transfer-Encoding : chunked로 반환하는 서버에서 엔드 포인트를 스트리밍해야합니다.개조가 된 스트리밍 서버 2 - 청크

다음 코드가 있지만 응답을 읽을 수 없습니다. responseBody.streamBytes() 시도하고 입력 스트림을 문자열로 변환하지만 주 스레드에서 그것을 할 수 없습니다. 어떻게 응답을 읽을 수 있습니까?

@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() { 
       } 
      }); 

편집 :

서버 응답 사용 CURL :

* 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

@Streaming 주석 원인은 메모리에 전체 파일을 이동 한 것이 아니라 지금 당장에 들어오는 바이트를 통과하지 개조 추가. 이렇게하면 총 가용 메모리보다 큰 데이터 스트림을 처리 할 수 ​​있습니다. 그러나 주 스레드에서이 작업을 수행하려고하면 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