2017-11-22 3 views
0

これは不正なチェックのためのインターセプタコードです。Log.e Interceptorで何らかの問題を作成しています

class UnauthorizedInterceptor implements Interceptor { 

    private Context context; 

    UnauthorizedInterceptor(Context context) { 
     this.context = context; 
    } 

    @Override 
    public Response intercept(Chain chain) throws IOException { 
     Request request = chain.request(); 
     Response response = chain.proceed(request); 
     Log.e("response: ", response.body().string()); // creating problem 
     ObjectMapper objectMapper = new ObjectMapper(); 
     ServerResponse serverResponse = objectMapper.readValue(response.body().string(), ServerResponse.class); 
     if (serverResponse.getErrorCode() == 401) { 
      throw new UnauthorizedException(R.string.unauthorized_user); 
     } else { 
      return response; 
     } 
    } 

    private class UnauthorizedException extends IOException { 

     UnauthorizedException(final int stringRes) { 
      super(context.getString(stringRes)); 
      new Handler(Looper.getMainLooper()).post(new Runnable() { 
       @Override 
       public void run() { 
        Toast.makeText(context, stringRes, Toast.LENGTH_SHORT).show(); 
       } 
      }); 
     } 
    } 

} 

私はその後、私はレトロフィット成功コールバックで任意の応答を取得していない午前インターセプタでLog.eを使用している場合。しかし、Log.eはlogcatの応答を適切に表示します。その後、Retrofitの成功コールバックにコールバックを与えません。エラーコールバックに戻り、IllegalStateException:closedとなります。

しかし、私がLog.eのコードを傍受者にコメントアウトした場合、うまくいきます。

なぜそれが起こっているのですか?誰もこの事を説明してもらえますか?

ありがとうございます。

+0

Log.eラインが壊れているようです。正しくコピーしてもよろしいですか? –

+0

@AleksandrMedvedevが更新されました。申し訳ありませんが、私は括弧がstackoverflowで入力中に逃した。 –

+0

あなたのLog.eは間違っています。あなたの場合** Log.e(TAG、 "response:" + response.body()。string()); ** –

答えて

1

response.body()は1回のみ呼び出し可能です。
そうすると、内部変数が消費されるため、後でnullになります。
その呼び出しからの値を変数に保存してから、その変数から情報を取得するときに使用する/ログに記録する必要があります。

+0

入手しました。私はresponse.body()で検索し、一度だけ呼び出すことができ、適切な答えを得ました。ありがとう。 –

0

これはresponse.body()方法のドキュメントであり:この応答は、{@link コールバック番号のonResponse}に渡さまたは{@link)(#実行呼び出し}から返された場合

が非ヌル値を返し。レスポンス のボディは、応答コンテキストが閉じられている必要があります。 を1回だけ消費することがあります。

これは、{@ link#cacheResponse}、{@ link#networkResponse}、および{@link #priorResponse()}から返されるレスポンスに常にnullを返します。

Githubの問題のリンクも追加しています。これは、この問題に関してより多くの助けになります。

https://github.com/square/okhttp/issues/1240

関連する問題