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

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

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

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

Kotlin

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

Q&A

解決済

1回答

463閲覧

thread内で作成した変数を関数の戻り値にする方法

RailStar

総合スコア16

Android

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

Kotlin

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

0グッド

0クリップ

投稿2022/07/23 07:45

実現したいこと

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内での宣言

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hoshi-takanori

2022/07/23 07:52

fetchApiQuestion を実行するスレッドと、通信を行う thread は別なので、通信結果を fetchApiQuestion の戻り値にするには thread を待つ必要がありますが、それをするとたぶん UI スレッドを止めることになり、Android では不適切です。 通信結果を受け取ったら、UI スレッドで表示を更新する処理をあらためてスケジューリングする必要があるかと。 (というか、生の thread よりもコルーチンや async/await を使うと良いのでは。)
guest

回答1

0

ベストアンサー

featchApiQuestionのメソッド内にthreadタグを入れないで、メソッドを呼ぶ場所をthreadタグで囲めば良いと思います。

kotlin

1thread { 2 val response = featchApiQuestion() 3 Log.d(“TAG”, response) 4}

投稿2022/07/23 11:23

Uhoho

総合スコア38

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

RailStar

2022/07/23 11:29

おっしゃる通りに変更したら正しく動作しました。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問