0. 環境

[Windows] 7
[Java] 1.8
[Android] 5.1.1
[Android API] 26

1. 問題

  • Androidアプリの開発で、自前のAPIからデータを取得する処理を組んでいたところ、下記エラーが発生するようになりました。

    java.net.SocketException: Socket is closed
    

    コードはこちら。

2. 対策

  • まずAPI側でApacheのログを確認したところ、ステータスコード200で問題なしでした。

    127.0.0.1 - - [05/May/2018:22:55:02 +0900] "POST /api/test HTTP/1.0" 200 11130
    

    正常終了するケースとの違いは、レスポンスのデータ量が多くなってることかな。(上記ログ右端)

  • 次にAndroidアプリ側の処理があやしいと考えて、いろいろ試した結果、HttpsURLConnectionのクローズのタイミングが問題だと分かりました。

    同オブジェクトを参照しているオブジェクトを全て使い終わってから、クローズする必要がありそうです。(上記(1)→(2)に移す)

    また、クローズ処理を消すだけでも冒頭のエラーは出なくなりましたが、なるべくオブジェクトは明示的に閉じた方が良いと思います。

    なので、最終的にオブジェクトの作成順とは逆にクローズしていく処理を入れました。(下記(3)(4))