twin-te / twinte-android

Twin:te Android アプリ

Home Page:https://play.google.com/store/apps/details?id=net.twinte.android

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

ネットワークリクエスト時に `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 したタイミングで発生するネットワークリクエストである。

try {
scheduleDataStore.update()
} catch (e: NotLoggedInException) {
// 未ログイン時は失敗するが何もしない
}