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

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

新規登録して質問してみよう
ただいま回答率
86.12%
Google API

Googleは多種多様なAPIを提供していて、その多くはウェブ開発者向けのAPIです。それらのAPIは消費者に人気なGoogleのサービス(Google Maps, Google Earth, AdSense, Adwords, Google Apps,YouTube等)に基づいています。

Android

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

バックグラウンド処理

バックグラウンド処理とは、マルチタスク環境において、ユーザーに対して前面に表示させている処理の裏側で実行させる処理のことを呼びます。バックグラウンド処理を行う事によって、ユーザーが他の作業に携わることが可能となります。

非同期処理

非同期処理とは一部のコードを別々のスレッドで実行させる手法です。アプリケーションのパフォーマンスを向上させる目的でこの手法を用います。

Kotlin

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

受付中

android 時間のかかる処理 対処法

kasai2_s_2_s
kasai2_s_2_s

総合スコア7

Google API

Googleは多種多様なAPIを提供していて、その多くはウェブ開発者向けのAPIです。それらのAPIは消費者に人気なGoogleのサービス(Google Maps, Google Earth, AdSense, Adwords, Google Apps,YouTube等)に基づいています。

Android

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

バックグラウンド処理

バックグラウンド処理とは、マルチタスク環境において、ユーザーに対して前面に表示させている処理の裏側で実行させる処理のことを呼びます。バックグラウンド処理を行う事によって、ユーザーが他の作業に携わることが可能となります。

非同期処理

非同期処理とは一部のコードを別々のスレッドで実行させる手法です。アプリケーションのパフォーマンスを向上させる目的でこの手法を用います。

Kotlin

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

0回答

0リアクション

0クリップ

553閲覧

投稿2021/08/09 18:22

実現したいこと

作成中のアプリ内に時間のかかる処理があるのですが、その処理が終わるのを待ってから次の処理へ行くようなプログラムを実装したいです。

処理の呼び出しの例は以下です。

kotlin

// 関数の呼び出し部分 // 下記のように、1行目の処理を終えてから、その結果を踏まえて2行目の処理を行いたい currentPlaceInfoViewModel.updateCurrentPlaceInfo() weatherInfoViewModel.loadWeatherInfo(currentPlaceInfoViewModel.lat, currentPlaceInfoViewModel.lon)

上記の1行目の処理は、端末の現在位置の緯度経度を取得し、それらの値をcurrentPlaceInfoViewModelが持つ変数(latとlon)にセットする処理です。そして1行目でセットした値を2行目の引数として扱いたいため、1行目の処理(時間のかかる処理)を終えたのちに2行目の処理を実行したいです。

抱えている問題

上記のコードの1行目の処理(緯度経度の取得、currentPlaceInfoViewModelの持つ変数への値のセット)の結果を待たずして2行目が呼び出されてしまい、2行目の引数に意図した値を設定できません。

ソースコード

時間のかかる処理:updateCurrentPlaceInfo関数内のplacesClient.findCurrentPlace(request)

placeResponse.addOnCompleteListenerで設定した処理は、placesClient.findCurrentPlace(request) が完了した時に呼び出されます。

kotlin

fun updateCurrentPlaceInfo() { // Use fields to define the data types to return. val placeFields: List<Place.Field> = listOf(Place.Field.LAT_LNG) // Use the builder to create a FindCurrentPlaceRequest. val request: FindCurrentPlaceRequest = FindCurrentPlaceRequest.newInstance(placeFields) // Call findCurrentPlace and handle the response (first check that the user has granted permission). if (ContextCompat.checkSelfPermission(getApplication<Application>(), Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) { val placesClient = Places.createClient(getApplication<Application>()) val placeResponse = placesClient.findCurrentPlace(request) //おそらくここの処理が時間がかかっている        //時間のかかる処理が完了した時に呼ばれるリスナーを追加している部分 placeResponse.addOnCompleteListener { task -> if (task.isSuccessful) { Log.d("placeResponse", "success") val mostAccurateCurrentPlaceInfo = getMostAccurateCurrentLocation(task) val latResult = mostAccurateCurrentPlaceInfo?.place?.latLng?.latitude val lonResult = mostAccurateCurrentPlaceInfo?.place?.latLng?.longitude                // ここで緯度経度の値をcurrentPlaceInfoViewModelが持つ変数(_latと_lon)にセットしている // セットした_latと_lonを、この関数(updateCurrentPlaceInfo())が呼び出された後の処理の引数として使いたい if (latResult != null && lonResult != null) { _lat = latResult _lon = lonResult } } else { val exception = task.exception if (exception is ApiException) { Log.d(ContentValues.TAG, "Place not found: ${exception.statusCode}") } } } } else { Log.d("CurrentPlaceInfoVM", "not granted") }

kotlin

// 上記の関数の呼び出し部分 // 下記のように、1行目の処理を終えてから、その結果を踏まえて2行目の処理を行いたい currentPlaceInfoViewModel.updateCurrentPlaceInfo() weatherInfoViewModel.loadWeatherInfo(currentPlaceInfoViewModel.lat, currentPlaceInfoViewModel.lon)

試したこと

色々調べた所、下記の資料に書いてあるCoroutinesという機能を使うとこの問題を解決できそうだということは分かりました。
(参考にした資料:https://droidkaigi.github.io/codelabs-kotlin-coroutines-ja/#3)
しかし、時間のかかる処理(placesClient.findCurrentPlace(request))を、どうやって参考資料のようにsuspend関数にするのかがよく分からす、解決には至っていません。

以下のような質問にはリアクションをつけましょう

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

リアクションが多い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

hoshi-takanori

2021/08/09 18:46

非同期処理ですね。updateCurrentPlaceInfo 自体は問い合わせを開始するだけですぐに制御を戻します。その結果が得られてから行いたい処理は addOnCompleteListener の {} の中に書く必要があります。

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

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

アカウントをお持ちの方は

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

ただいまの回答率
86.12%

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

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

質問する

関連した質問

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

Google API

Googleは多種多様なAPIを提供していて、その多くはウェブ開発者向けのAPIです。それらのAPIは消費者に人気なGoogleのサービス(Google Maps, Google Earth, AdSense, Adwords, Google Apps,YouTube等)に基づいています。

Android

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

バックグラウンド処理

バックグラウンド処理とは、マルチタスク環境において、ユーザーに対して前面に表示させている処理の裏側で実行させる処理のことを呼びます。バックグラウンド処理を行う事によって、ユーザーが他の作業に携わることが可能となります。

非同期処理

非同期処理とは一部のコードを別々のスレッドで実行させる手法です。アプリケーションのパフォーマンスを向上させる目的でこの手法を用います。

Kotlin

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