2017-01-22 5 views
1

스트림 응답을 계속 사용하고 싶습니다. 지금까지 내 코드입니다. 나는 내가 오래 동안 연결을 유지할 수 없다고 생각한다.okhttp3를 사용하여 Android 스트리밍 트위터 API를 어떻게 소비합니까?

Callback failure for call to https://stream.twitter.com/... 
01-22 13:03:25.238 27785-28965/in.androidlab.twittervisualiser D/OkHttp: java.net.ProtocolException: unexpected end of stream 
01-22 13:03:25.239 27785-28965/in.androidlab.twittervisualiser D/OkHttp:  at okhttp3.internal.http1.Http1Codec$ChunkedSource.read(Http1Codec.java:433) 
01-22 13:03:25.239 27785-28965/in.androidlab.twittervisualiser D/OkHttp:  at okio.RealBufferedSource.read(RealBufferedSource.java:45) 
01-22 13:03:25.239 27785-28965/in.androidlab.twittervisualiser D/OkHttp:  at okio.RealBufferedSource.exhausted(RealBufferedSource.java:55) 
01-22 13:03:25.239 27785-28965/in.androidlab.twittervisualiser D/OkHttp:  at okio.InflaterSource.refill(InflaterSource.java:101) 
01-22 13:03:25.239 27785-28965/in.androidlab.twittervisualiser D/OkHttp:  at okio.InflaterSource.read(InflaterSource.java:62) 
01-22 13:03:25.239 27785-28965/in.androidlab.twittervisualiser D/OkHttp:  at okio.GzipSource.read(GzipSource.java:80) 
01-22 13:03:25.239 27785-28965/in.androidlab.twittervisualiser D/OkHttp:  at okio.Buffer.writeAll(Buffer.java:996) 
01-22 13:03:25.239 27785-28965/in.androidlab.twittervisualiser D/OkHttp:  at okio.RealBufferedSource.readString(RealBufferedSource.java:189) 
01-22 13:03:25.239 27785-28965/in.androidlab.twittervisualiser D/OkHttp:  at okhttp3.ResponseBody.string(ResponseBody.java:174) 
01-22 13:03:25.239 27785-28965/in.androidlab.twittervisualiser D/OkHttp:  at in.androidlab.twittervisualiser.MainActivity$1.onResponse(MainActivity.java:104) 
01-22 13:03:25.239 27785-28965/in.androidlab.twittervisualiser D/OkHttp:  at okhttp3.RealCall$AsyncCall.execute(RealCall.java:135) 
01-22 13:03:25.239 27785-28965/in.androidlab.twittervisualiser D/OkHttp:  at okhttp3.internal.NamedRunnable.run(NamedRunnable.java:32) 
01-22 13:03:25.239 27785-28965/in.androidlab.twittervisualiser D/OkHttp:  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112) 
01-22 13:03:25.239 27785-28965/in.androidlab.twittervisualiser D/OkHttp:  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587) 
01-22 13:03:25.239 27785-28965/in.androidlab.twittervisualiser D/OkHttp:  at java.lang.Thread.run(Thread.java:818) 

나는 또한 WebSocketListener으로 시도 :

OkHttpOAuthConsumer consumer = new OkHttpOAuthConsumer("**********", 
       "**********"); 
     consumer.setTokenWithSecret("***********", 
       "*************"); 

     OkHttpClient client = new OkHttpClient.Builder() 
       .addInterceptor(new SigningInterceptor(consumer)) 
       .build(); 

     Request request = new Request.Builder() 
       .url("https://stream.twitter.com/1.1/statuses/filter.json?track=twitter") 
       .build(); 

client.newCall(request).enqueue(new Callback() { 
      @Override 
      public void onFailure(Call call, IOException e) { 
       e.printStackTrace(); 
      } 

      @Override 
      public void onResponse(Call call, final Response response) throws IOException { 

       final String responseData = response.body().string(); 
       Log.d("RESPONSE TWEETS" , responseData); 

      } 
     }); 

나는 다음과 같은 예외를 얻을. 나는

WebSocketListener listener = new WebSocketListener() { 
      @Override 
      public void onOpen(WebSocket webSocket, Response response) { 
       super.onOpen(webSocket, response); 
       Log.d("RESPONSE Twitter", response.message()); 
      } 

      @Override 
      public void onMessage(WebSocket webSocket, String text) { 
       super.onMessage(webSocket, text); 
       Log.d("RESPONSE Twitter", text); 
      } 

      @Override 
      public void onMessage(WebSocket webSocket, ByteString bytes) { 
       super.onMessage(webSocket, bytes); 
      } 

      @Override 
      public void onClosing(WebSocket webSocket, int code, String reason) { 
       super.onClosing(webSocket, code, reason); 
      } 

      @Override 
      public void onClosed(WebSocket webSocket, int code, String reason) { 
       super.onClosed(webSocket, code, reason); 
      } 

      @Override 
      public void onFailure(WebSocket webSocket, Throwable t, Response response) { 
       super.onFailure(webSocket, t, response); 
      } 
     }; 

     WebSocket ws = client.newWebSocket(request, listener); 

답변

1

https://stream.twitter.com/1.1/statuses/filter.json?track=twitter가 웹 소켓 호출하지의 onMessage의 모든 응답()을 받고 있지 않다. https://dev.twitter.com/streaming/overview

스트리밍 정규 HTTP 호출로 처리해야합니다.

여기 https://github.com/square/okhttp/wiki/Recipes

설명하지만 응답 본체 (1 MiB 크기보다 큰) 큰 경우 메모리에 전체 문서를로드하므로, 현() 을 방지한다. 이 경우 은 본문을 스트림으로 처리하는 것을 선호합니다.

는 스트림

https://github.com/yschimke/oksocial/blob/3757196cde420b9d0fe37cf385b66f4cdafb1ae1/src/main/java/com/baulsupp/oksocial/output/DownloadHandler.java

@Override public void showOutput(Response response, boolean showHeaders) throws IOException { 
    BufferedSource source = response.body().source(); 

    Sink outputSink = getOutputSink(response); 
    try { 
     writeToSink(source, outputSink); 
    } finally { 
     if (!isStdout()) { 
     outputSink.close(); 
     } 
    } 
    } 

    public static void writeToSink(BufferedSource source, Sink out) throws IOException { 
    while (!source.exhausted()) { 
     out.write(source.buffer(), source.buffer().size()); 
     out.flush(); 
    } 
로 응답을 처리하기위한 몇몇 예시적인 코드