前提・実現したいこと
現在、andoidアプリから画像をサーバーへ送る機能をkotlinで実装しています。
画像はbase64文字列に変換して、文字列として送っています。
サーバーはNode.jsで作られています。
サーバーへ画像の送信はできているのですが、送った後しばらくするとアプリが落ちてしまいます。原因がわからなかったため質問させていただきました。
発生している問題・エラーメッセージ
java.io.InterruptedIOException: timeout
該当のソースコード
MainActivity
1package com.websarva.wings.android.testhttpphoto 2 3import android.graphics.Bitmap 4import androidx.appcompat.app.AppCompatActivity 5import android.os.Bundle 6import android.util.Base64 7import android.widget.Button 8import android.widget.ImageView 9import androidx.core.graphics.drawable.toBitmap 10import androidx.lifecycle.lifecycleScope 11import com.squareup.moshi.Moshi 12import kotlinx.coroutines.Dispatchers 13import kotlinx.coroutines.launch 14import kotlinx.coroutines.withContext 15import okhttp3.OkHttpClient 16import retrofit2.Retrofit 17import retrofit2.Retrofit.* 18import retrofit2.converter.moshi.MoshiConverterFactory 19import retrofit2.create 20import java.io.ByteArrayOutputStream 21import java.util.concurrent.TimeUnit 22 23class MainActivity : AppCompatActivity() { 24 override fun onCreate(savedInstanceState: Bundle?) { 25 super.onCreate(savedInstanceState) 26 setContentView(R.layout.activity_main) 27 28 val imageView = findViewById<ImageView>(R.id.image) 29 val bit = imageView.drawable.toBitmap(200,200,) 30 val btn = findViewById<Button>(R.id.button2) 31 val moshi = Moshi.Builder() 32 .add(ApplicationJsonAdapterFactory) 33 .build() 34 val okHttpClient = OkHttpClient.Builder() 35 .readTimeout(80, TimeUnit.SECONDS) 36 .connectTimeout(80, TimeUnit.SECONDS) 37 .writeTimeout(80, TimeUnit.SECONDS) 38 .callTimeout(80, TimeUnit.SECONDS) 39 .build() 40 val retrofit = Builder() 41 .client(okHttpClient) 42 .baseUrl("サーバー名") 43 .addConverterFactory(MoshiConverterFactory.create(moshi).asLenient()) 44 .build() 45 val api = retrofit.create<API>() 46 47 btn.setOnClickListener { 48 val base64 = toBase64toString(bit) 49 val photo1 = Photo( 50 "test", 51 base64 52 ) 53 lifecycleScope.launch { 54 withContext(Dispatchers.IO) { 55 api.postPhoto(photo1) 56 } 57 } 58 } 59 } 60 private fun toBase64toString(bm: Bitmap):String { 61 val baos = ByteArrayOutputStream() 62 bm.compress(Bitmap.CompressFormat.JPEG,100,baos) 63 val b = baos.toByteArray() 64 return Base64.encodeToString(b, Base64.DEFAULT) 65 } 66 67}
API
1package com.websarva.wings.android.testhttpphoto 2 3import kotlinx.coroutines.delay 4import okhttp3.RequestBody 5import retrofit2.Response 6import retrofit2.http.* 7import java.io.File 8import java.util.* 9 10interface API { 11 @POST("/register_photo") 12 suspend fun postPhoto(@Body photo: Photo) : Response<Unit> 13}
Photo
1package com.websarva.wings.android.testhttpphoto 2 3import com.squareup.moshi.JsonAdapter 4import com.squareup.moshi.Moshi 5import se.ansman.kotshi.JsonSerializable 6import se.ansman.kotshi.KotshiJsonAdapterFactory 7 8@JsonSerializable 9data class Photo( 10 val id: String?, 11 val photo: String? 12) 13@KotshiJsonAdapterFactory 14object 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 }
}
回答1件
あなたの回答
tips
プレビュー