2016-09-28 114 views
2

我正在使用retrofit2開發android應用程序。 gzip有問題,這裏是異常堆棧。 我不知道異常在哪裏發生。任何建議表示讚賞。謝謝。Android Retrofit 2 gzip錯誤

Unknown exception 
java.io.EOFException 
    at okio.RealBufferedSource.require(RealBufferedSource.java:64) 
    at okio.GzipSource.consumeHeader(GzipSource.java:114) 
    at okio.GzipSource.read(GzipSource.java:73) 
    at okio.RealBufferedSource.request(RealBufferedSource.java:71) 
    at okhttp3.logging.HttpLoggingInterceptor.intercept(HttpLoggingInterceptor.java:225) 
    at okhttp3.RealCall$ApplicationInterceptorChain.proceed(RealCall.java:187) 
    at okhttp3.RealCall.getResponseWithInterceptorChain(RealCall.java:160) 
    at okhttp3.RealCall.execute(RealCall.java:57) 
    at retrofit2.OkHttpCall.execute(OkHttpCall.java:174) 
    at retrofit2.ExecutorCallAdapterFactory$ExecutorCallbackCall.execute(ExecutorCallAdapterFactory.java:89) 
    at com.hello.de.aloha.domain.interactor.RetrofitServerInteraction.callVerifyOauthToken(RetrofitServerInteraction.java:424) 
    at com.hello.de.aloha.domain.security.SecurityHandshake.validateOAuthToken(SecurityHandshake.java:178) 
    at com.hello.de.aloha.domain.security.SecurityHandshake.requestOAuthToken(SecurityHandshake.java:150) 
    at com.hello.de.aloha.domain.security.SecurityHandshake.authenticate(SecurityHandshake.java:122) 
    at com.hello.de.aloha.domain.security.SecurityHandshake.challenge(SecurityHandshake.java:70) 
    at com.hello.de.aloha.domain.interceptor.SecurityInterceptor.determineNewToken(SecurityInterceptor.java:152) 
    at com.hello.de.aloha.domain.interceptor.SecurityInterceptor.intercept(SecurityInterceptor.java:89) 
    at okhttp3.RealCall$ApplicationInterceptorChain.proceed(RealCall.java:187) 
    at com.hello.de.aloha.domain.interceptor.SendCookieInterceptor.intercept(SendCookieInterceptor.java:46) 
    at okhttp3.RealCall$ApplicationInterceptorChain.proceed(RealCall.java:187) 
    at com.hello.de.aloha.domain.interceptor.ReceiveCookiesInterceptor.intercept(ReceiveCookiesInterceptor.java:43) 
    at okhttp3.RealCall$ApplicationInterceptorChain.proceed(RealCall.java:187) 
    at com.hello.de.aloha.domain.interceptor.HttpParamInterceptor.intercept(HttpParamInterceptor.java:75) 
    at okhttp3.RealCall$ApplicationInterceptorChain.proceed(RealCall.java:187) 
    at okhttp3.logging.HttpLoggingInterceptor.intercept(HttpLoggingInterceptor.java:203) 
    at okhttp3.RealCall$ApplicationInterceptorChain.proceed(RealCall.java:187) 
    at okhttp3.RealCall.getResponseWithInterceptorChain(RealCall.java:160) 
    at okhttp3.RealCall.access$100(RealCall.java:30) 
    at okhttp3.RealCall$AsyncCall.execute(RealCall.java:127) 
    at okhttp3.internal.NamedRunnable.run(NamedRunnable.java:32) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587) 
    at java.lang.Thread.run(Thread.java:818) 
+0

你可以發佈你使用改造方法嗎? –

回答

2

我已經檢查在GzipSource代碼:

private void consumeHeader() throws IOException { 
     // Read the 10-byte header. We peek at the flags byte first so we know if we 
     // need to CRC the entire header. Then we read the magic ID1ID2 sequence. 
     // We can skip everything else in the first 10 bytes. 
     // +---+---+---+---+---+---+---+---+---+---+ 
     // |ID1|ID2|CM |FLG|  MTIME  |XFL|OS | (more-->) 
     // +---+---+---+---+---+---+---+---+---+---+ 
     source.require(10); 
     ... 
    } 
@Override public void require(long byteCount) throws IOException { 
    if (!request(byteCount)) throw new EOFException(); 
    } 

    @Override public boolean request(long byteCount) throws IOException { 
    if (byteCount < 0) throw new IllegalArgumentException("byteCount < 0: " + byteCount); 
    if (closed) throw new IllegalStateException("closed"); 
    while (buffer.size < byteCount) { 
     if (source.read(buffer, Segment.SIZE) == -1) return false; 
    } 
    return true; 
    } 

看來你的響應數據違反的gzip格式。所以建議先檢查響應數據。您可能還需要檢查傳入的影響響應數據格式的請求頭(即接受:gzip)。