web-dev-qa-db-ja.com

いつresponse.body()。close()を呼び出すか

Android SDKはOkHttpを使用しています。SDKを使用するサンプルアプリではすべてが正常に機能します。ただし、StrictModeがオンの場合、ユーザーの1人が次のJava.lang.Throwable: Explicit termination method 'close' not calledを取得しています。 StrictModeをオンにして自分のアプリでこれを複製しようとしましたが、このエラーは発生しません。

私はresponse.body().close()を呼び出す必要があることを理解していますが、これがアプリで発生しない理由についてはまだ少し混乱しています。彼が私に送ったスタックトレースには、クラスが含まれているだけなので、コードに何かが原因であるようには見えません。

また、私のSDKが作成する要求の1つだけが、実際に応答を読み取っていることにも注意してください。しかし、それは私のユーザーが例外を引き起こしていると言う要求ではありません。

これを引き起こしている可能性のある何か他にありますか?

.close()はいつ呼び出す必要がありますか? execute()を呼び出した直後に呼び出すことをお勧めしますか?体を閉じると、それ以降は読めなくなりますか?

16
tbeauvais

常にclose()を呼び出す必要があります。 OkHttpのソース から:

呼び出し元は、応答のResponse.body()メソッドを使用して応答の本文を読み取ることができます。接続のリサイクルを容易にするために、呼び出し側は常に応答本文を閉じる必要があります。

応答から必要なものを取得したらすぐにclose()を呼び出す必要があります。変数に保存してから、ResponseBodyを閉じます。

17
ordonezalex