質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
87.20%
HTTP

HTTP(Hypertext Transfer Protocol)とはweb上でHTML等のコンテンツを交換するために使われるアプリケーション層の通信プロトコルです。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Kotlin

Kotlinは、ジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、 静的型付けのオブジェクト指向プログラミング言語です。

解決済

Androidアプリから画像をサーバーに送信した後にアプリが落ちてしまう

okamoto1234
okamoto1234

総合スコア0

HTTP

HTTP(Hypertext Transfer Protocol)とはweb上でHTML等のコンテンツを交換するために使われるアプリケーション層の通信プロトコルです。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Kotlin

Kotlinは、ジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、 静的型付けのオブジェクト指向プログラミング言語です。

1回答

0評価

0クリップ

412閲覧

投稿2022/01/10 08:55

前提・実現したいこと

現在、andoidアプリから画像をサーバーへ送る機能をkotlinで実装しています。
画像はbase64文字列に変換して、文字列として送っています。
サーバーはNode.jsで作られています。
サーバーへ画像の送信はできているのですが、送った後しばらくするとアプリが落ちてしまいます。原因がわからなかったため質問させていただきました。

発生している問題・エラーメッセージ

java.io.InterruptedIOException: timeout

該当のソースコード

MainActivity

package com.websarva.wings.android.testhttpphoto import android.graphics.Bitmap import androidx.appcompat.app.AppCompatActivity import android.os.Bundle import android.util.Base64 import android.widget.Button import android.widget.ImageView import androidx.core.graphics.drawable.toBitmap import androidx.lifecycle.lifecycleScope import com.squareup.moshi.Moshi import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import kotlinx.coroutines.withContext import okhttp3.OkHttpClient import retrofit2.Retrofit import retrofit2.Retrofit.* import retrofit2.converter.moshi.MoshiConverterFactory import retrofit2.create import java.io.ByteArrayOutputStream import java.util.concurrent.TimeUnit class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) val imageView = findViewById<ImageView>(R.id.image) val bit = imageView.drawable.toBitmap(200,200,) val btn = findViewById<Button>(R.id.button2) val moshi = Moshi.Builder() .add(ApplicationJsonAdapterFactory) .build() val okHttpClient = OkHttpClient.Builder() .readTimeout(80, TimeUnit.SECONDS) .connectTimeout(80, TimeUnit.SECONDS) .writeTimeout(80, TimeUnit.SECONDS) .callTimeout(80, TimeUnit.SECONDS) .build() val retrofit = Builder() .client(okHttpClient) .baseUrl("サーバー名") .addConverterFactory(MoshiConverterFactory.create(moshi).asLenient()) .build() val api = retrofit.create<API>() btn.setOnClickListener { val base64 = toBase64toString(bit) val photo1 = Photo( "test", base64 ) lifecycleScope.launch { withContext(Dispatchers.IO) { api.postPhoto(photo1) } } } } private fun toBase64toString(bm: Bitmap):String { val baos = ByteArrayOutputStream() bm.compress(Bitmap.CompressFormat.JPEG,100,baos) val b = baos.toByteArray() return Base64.encodeToString(b, Base64.DEFAULT) } }

API

package com.websarva.wings.android.testhttpphoto import kotlinx.coroutines.delay import okhttp3.RequestBody import retrofit2.Response import retrofit2.http.* import java.io.File import java.util.* interface API { @POST("/register_photo") suspend fun postPhoto(@Body photo: Photo) : Response<Unit> }

Photo

package com.websarva.wings.android.testhttpphoto import com.squareup.moshi.JsonAdapter import com.squareup.moshi.Moshi import se.ansman.kotshi.JsonSerializable import se.ansman.kotshi.KotshiJsonAdapterFactory @JsonSerializable data class Photo( val id: String?, val photo: String? ) @KotshiJsonAdapterFactory object ApplicationJsonAdapterFactory : JsonAdapter.Factory by KotshiApplicationJsonAdapterFactory

補足情報(FW/ツールのバージョンなど)

android {
compileSdk 31

defaultConfig { applicationId "com.websarva.wings.android.testhttpphoto" minSdk 21 targetSdk 31 versionCode 1 versionName "1.0" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } } compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } kotlinOptions { jvmTarget = '1.8' } buildFeatures { viewBinding true }

}

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

jimbe

2022/01/10 09:48

> 原因がわからなかった > timeout 出てますけど。 送信した後、適切に始末していないのではないでしょうか。
okamoto1234

2022/01/10 10:04

始末とはどうゆうことでしょうか? 送信が成功した場合、何もしなくても勝手に終わってくれると思っていました。
jimbe

2022/01/10 10:10

> 何もしなくても勝手に終わってくれると思っていました そう思っていたとしても、現象からみて"そうではないかもしれない"と認識を疑う必要があるのではないでしょうか? そこから、使っているライブラリ等で、使った後に何をするべきとなっているのかを調べる動機が生まれると思います。
okamoto1234

2022/01/10 10:35

一応、成功しているのにtimeoutする理由はなんなのかは調べてみました。 スレッドの問題なのかライブラリの使用の仕方が悪いのか、いまいちわからなかったため質問してみました。同じ方法で複数の文字列をJSONサーバーに送った時は、timeoutでアプリが落ちることはなかったので、画像ではなぜそうなるのかが調べてもわかりませんでした。

まだ回答がついていません

会員登録して回答してみよう

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
87.20%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

HTTP

HTTP(Hypertext Transfer Protocol)とはweb上でHTML等のコンテンツを交換するために使われるアプリケーション層の通信プロトコルです。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Kotlin

Kotlinは、ジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、 静的型付けのオブジェクト指向プログラミング言語です。