実現したいこと
thread内で使用した変数を関数の戻り値にする
発生している問題・エラーメッセージ
事前に宣言した内容(ここでは変数qtextで内容がerror)が出力され、thread内で更新したはずのデータが更新されていない。
該当のソースコード
kotlin
1class ApiModel{ 2 fun fetchApiQuestion():String{ 3 var qtext="error" 4 val moshi = Moshi.Builder() 5 .add(KotlinJsonAdapterFactory()) 6 .build() 7 8 val retrofit = Retrofit.Builder() 9 .baseUrl("hogehoge.com/") 10 .addConverterFactory(MoshiConverterFactory.create(moshi)) 11 .build() 12 13 thread{ 14 try { 15 val service: QuestionService = retrofit.create(QuestionService::class.java) 16 val questionApiResponse = service.fetchQuestion().execute().body() 17 ?: throw IllegalStateException("body is null") 18 19 qtext = questionApiResponse.toString() 20 Log.d("response", qtext) 21 Log.d("response-msg",qtext) 22 }catch (e: Exception) { 23 Log.d("response", "debug $e") 24 } 25 } 26 Log.d("response-return",qtext) 27 return qtext 28 } 29}
試したこと
thread外での宣言やthread内での宣言
fetchApiQuestion を実行するスレッドと、通信を行う thread は別なので、通信結果を fetchApiQuestion の戻り値にするには thread を待つ必要がありますが、それをするとたぶん UI スレッドを止めることになり、Android では不適切です。
通信結果を受け取ったら、UI スレッドで表示を更新する処理をあらためてスケジューリングする必要があるかと。
(というか、生の thread よりもコルーチンや async/await を使うと良いのでは。)
https://zenn.dev/nemuki/articles/my-first-android-app
上記のサイトを参考に作ったのですが、詳しく教えていただけませんか。
回答1件
あなたの回答
tips
プレビュー