ネットワークリクエスト時に `SocketTimeoutException` 等が uncaught exception 扱いになりクラッシュを招いている
private-yusuke opened this issue · comments
概要
サーバ負荷の高まり等によってリクエストがタイムアウトするとき、アプリケーションがクラッシュしていることを Play Console で確認した。
呼び出し元の例として
一般に、モバイルアプリでは uncaught exception によるクラッシュは一番避けたい事態であるが、新学期が始まったここ数日で頻繁にクラッシュが発生していることを確認したため修正したい。
修正方針
- (最低限)timeout が発生してもクラッシュしないように例外を適切にキャッチできるようにする
- ネットワークリクエストが失敗したときにユーザへダイアログ等によりその旨を通知する
- 非同期に予定を取得している箇所もあるが、そういうケースで失敗した際には別途通知を飛ばしたりしたほうがいいのか……?(要検討)
TwinteBackendHttpClientImpl
内で httpClient
を以下のように変更すると、意図的にタイムアウト関連の例外を発生させられる。
private val httpClient = OkHttpClient.Builder()
.connectTimeout(3000, TimeUnit.MILLISECONDS)
.retryOnConnectionFailure(true)
.readTimeout(3000, TimeUnit.MILLISECONDS)
.connectionPool(ConnectionPool(0, 1, TimeUnit.NANOSECONDS))
.readTimeout(100, TimeUnit.MILLISECONDS)
.callTimeout(100, TimeUnit.MILLISECONDS)
.connectTimeout(100, TimeUnit.MILLISECONDS)
.writeTimeout(100, TimeUnit.MILLISECONDS)
.webSocketCloseTimeout(100, TimeUnit.MILLISECONDS)
.cookieJar(WebViewCookieJar(cookieManager)).build()
これをすると、以下の箇所で java.io.InterruptedIOException
が unhandled であることからクラッシュしていることがわかる。これは、通知設定へ遷移する際に MainActivity が pause したタイミングで発生するネットワークリクエストである。
twinte-android/app/src/main/java/net/twinte/android/MainActivity.kt
Lines 222 to 226 in e9aad58