2017-01-22 5 views
1

Ich möchte weiterhin die Stream-Antwort verbrauchen. Das ist bisher mein Code. Ich denke, ich kann die Verbindung nicht lange offen halten.Wie verbrauche ich Twitter Streaming API in Android mit okhttp3?

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); 

      } 
     }); 

Ich erhalte die folgende Ausnahme:

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) 

ich auch mit WebSocketListener versucht. Ich erhalte keine Antwort in onMessage()

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); 

Antwort

1

https://stream.twitter.com/1.1/statuses/filter.json?track=twitter ist kein websocket Anruf. Siehe https://dev.twitter.com/streaming/overview

Sie müssen es als Streaming-regulären HTTP-Aufruf verarbeiten.

Als

hier https://github.com/square/okhttp/wiki/Recipes dokumentiert Aber wenn die Antwort Körper groß (größer als 1 MiB) ist, vermeiden string() , weil sie das gesamte Dokument in den Speicher geladen wird. In diesem Fall bevorzugen, den Körper als Stream zu verarbeiten.

Dies ist ein Beispielcode für die Verarbeitung der Antwort als Stream

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(); 
    } 
Verwandte Themen